結(jié)果adb斷了逾冬,而且開(kāi)發(fā)者模式允許調(diào)試功能關(guān)閉也沒(méi)了黍聂,
好在qq是屬于手機(jī)白名單,而我的手機(jī)也root了身腻,也安裝了qq機(jī)器人产还,哪怕重啟也會(huì)啟動(dòng)qq,而qq插件會(huì)自動(dòng)運(yùn)行機(jī)器人軟件,但是當(dāng)時(shí)的情況是忘記給機(jī)器人授權(quán)root指令了嘀趟,通過(guò)命令是無(wú)法運(yùn)行adb wifi這樣的軟件了脐区。
但是我竟然以為我的機(jī)器人應(yīng)該沒(méi)寫(xiě)支持shell的命令,畢竟很久沒(méi)搞機(jī)器人了她按,坡椒,現(xiàn)在干著急半天,而且我還看了機(jī)器人源代碼尤溜,發(fā)現(xiàn)支持shell執(zhí)行倔叼,但是我沒(méi)給root權(quán)限授權(quán),執(zhí)行完成之后一直提示
Unallowed user
并沒(méi)有其他寫(xiě)啟動(dòng)應(yīng)用(免root)的指令宫莱,最后靈光一現(xiàn)丈攒,現(xiàn)在手機(jī)連接上usb,雖然無(wú)法啟動(dòng)開(kāi)發(fā)者模式,但是還可以通過(guò)電腦訪(fǎng)問(wèn)存儲(chǔ)目錄呀授霸,好在我的機(jī)器人支持加載java插件巡验,js插件,而且存儲(chǔ)目錄都是外部存儲(chǔ)碘耳, 對(duì)我來(lái)說(shuō)肯定選擇java插件了显设,
js我感覺(jué)還是吃力,于是我編寫(xiě)了一個(gè)插件辛辨,然后執(zhí)行了配置 重載
以及插件信息
發(fā)現(xiàn)成功加載機(jī)器人插件了捕捂,然后成功啟動(dòng)了應(yīng)用瑟枫,然后通過(guò)路由器查看到了手機(jī)的ip地址,然后就通過(guò)adb connect ip地址 成功連上了指攒,媽的慷妙!
最后我趕緊給我的機(jī)器人授權(quán)root。
下面是kingroot授權(quán)界面
下面是我寫(xiě)插件放到存儲(chǔ)目錄允悦,讓手機(jī)端啟動(dòng)應(yīng)用adb wifi應(yīng)用膝擂,然后電腦端連接adb connect ip 的插件代碼。
package cn.qssq666.robot.plugin.sdk.control;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.io.File;
import java.util.List;
import cn.qssq666.plugindemo.SimplePluginInterfaceWrapper;
import cn.qssq666.robot.plugin.sdk.interfaces.AtBeanModelI;
import cn.qssq666.robot.plugin.sdk.interfaces.IMsgModel;
/**
* Created by qssq on 2018/7/19 qssq666@foxmail.com
*/
//cn.qssq666.robot.plugin.sdk.control.PluginMainImpl
public class PluginMainImpl extends SimplePluginInterfaceWrapper {
private static final String TAG = "PluginMainImpl";
public File getPicRootdir() {
return new File("/sdcard/qssq666/pic");
}
String mLastMsg = "";
@Override
public String getAuthorName() {
return "情隨事遷";
}
@Override
public int getVersionCode() {
return 2;
}
@Override
public String getBuildTime() {
return "2021-8-14 01:15:07";
}
@Override
public String getVersionName() {
return "1.1";
}
@Override
public String getPackageName() {
return "cn.qssq666.applauncher";
}
@Override
public String getDescript() {
return "";
}
@Override
public String getPluginName() {
return "應(yīng)用啟動(dòng)";
}
@Override
public boolean isDisable() {
return false;
}
@Override
public void setDisable(boolean disable) {
}
@Override
public boolean onReceiveMsgIsNeedIntercept(IMsgModel item) {
mLastMsg = item.getMessage();
String message = item.getMessage();
if(message.startsWith("啟動(dòng)")){
if(!getConfigApi().isManager(item.getSenderuin())){
getControlApi().sendMsg(item.setMessage("你不是管理員"));
return true;
}
String packageName = message.substring(2);
if(TextUtils.isEmpty(packageName)){
getControlApi().sendMsg(item.setMessage("請(qǐng)輸入包名"));
}
try{
Context context = getContext();
PackageManager packageManager = context.getPackageManager();
Intent intent =null;
intent = packageManager.getLaunchIntentForPackage(packageName);
context.startActivity(intent);
getControlApi().sendMsg(item.setMessage("已啟動(dòng)"+ packageName));
}catch (Throwable e){
getControlApi().sendMsg(item.setMessage("啟動(dòng)失敗"+ Log.getStackTraceString(e)));
}
return true;
}
return false;
}
@Override
public boolean onReceiveOtherIntercept(IMsgModel item, int type) {
return false;
}
@Override
public void onDestory() {
}
@Override
public View onConfigUi(ViewGroup viewGroup) {
TextView textView = new TextView(viewGroup.getContext());
textView.setText("應(yīng)用啟動(dòng)" + mLastMsg);
return textView;
}
@Override
public int getMinRobotSdk() {
return 0;
}
@Override
public boolean onReceiveRobotFinalCallMsgIsNeedIntercept(IMsgModel iMsgModel, List<AtBeanModelI> list, boolean b, boolean b1) {
return false;
}
}
為了防止更多意外隙弛,還需要搞不用機(jī)器人也能開(kāi)機(jī)啟動(dòng)之類(lèi)的更好了架馋,這個(gè)可能需要借助xposed插件勾住launcher應(yīng)該可以,寫(xiě)一個(gè)自啟動(dòng)沒(méi)生效全闷,還需要研究是哪個(gè)應(yīng)用把自啟動(dòng)給禁用了叉寂,我目前沒(méi)有發(fā)現(xiàn)被禁用,但是沒(méi)找到原因室埋。