AccessibilityService结合adb命令 进行模拟点击

今天发现AccessibilityService对于一些无点击事件的控件是无法点击的(不会进行事件传递)
解决方案是:
先使用AccessibilityService获取控件在屏幕的坐标位置,然后使用adb命令进行坐标点击

public void adbClick(final String id,final String tv,int delay) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
AccessibilityNodeInfo root = service.getRootInActiveWindow();
if (root == null) {
Log.d(TAG, "adb 无Root:" + id);
}
List<AccessibilityNodeInfo> tab = root.findAccessibilityNodeInfosByViewId(id);
if (tab == null || tab.size() == 0) {
Log.d(TAG, "adb 找不到点击控件:" + id);
return;
}
for (AccessibilityNodeInfo info : tab) {
if (info.getText() != null && tv.equals(info.getText().toString())) {
Rect rect = new Rect();
info.getBoundsInScreen(rect);
Log.d(TAG, "adb点击位置: "+rect.top+","+rect.bottom+","+rect.left+","+rect.right);
adbShell("input tap " + rect.left + " " + rect.top);
} else Log.d(TAG, "abd 找不到点击控件:" + id + "," + tv);
}
}
}, delay);
}

public void adbShell(String cmd){
    try {
        // 申请获取root权限,这一步很重要,不然会没有作用
        Process process = Runtime.getRuntime().exec("su");
        // 获取输出流
        OutputStream outputStream = process.getOutputStream();
        DataOutputStream dataOutputStream = new DataOutputStream(
                outputStream);
        dataOutputStream.writeBytes(cmd);
        dataOutputStream.flush();
        dataOutputStream.close();
        outputStream.close();
        Log.d(TAG, "adbShell: 输出命令:"+cmd+"成功");
    } catch (Throwable t) {
        t.printStackTrace();
        Log.d(TAG, "adbShell: 输出命令:"+cmd+"失败");
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,787评论 25 709
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,761评论 0 17
  • 当绚丽的天空中浮云飘动时 我在想 是凉意飕飕的风儿吹散了云朵 还是一往情深的云朵追随着风儿 抑或只是 亘古不变的自...
    昙宓阅读 482评论 0 0
  • 换位思考,一直是心理学常用的手段。 春节的一天,在泰国潜水的船上,看一部美国电影“返老还童”(本杰明·巴顿),有了...
    小丸子爸爸教练堂阅读 755评论 0 4
  • 星空SAMA阅读 60评论 0 0