Android开发自动话操作Accessibilityservice和adb结合

来源:互联网 发布:pr防抖插件 mac 编辑:程序博客网 时间:2024/06/07 05:49

           网上有很多有关于accessibilityservice的文章,也有adb命令的文章,但是结合起来的好像没有,最近项目有用到这两个技术的结合,就融合了一下,有不完善或者写得不对的地方请大家指出来,共同研究研究。

         

           1、关于Accessibilityservice:

                 官方解释:                        

The classes in this package are used for development of accessibility service that provide alternative or augmented feedback to the user.
使用这个类可以开发用于给用户提供替换或者是增强反馈的辅助功能服务。

An AccessibilityService runs in the background and receives callbacks by the system when AccessibilityEvents are fired. Such events denote some state transition in the user interface, for example, the focus has changed, a button has been clicked, etc. Such a service can optionally request the capability for querying the content of the active window. Development of an accessibility service requires extends this class and implements its abstract methods.
一个AccessibilityService在后台运行并接收系统AccessibilityEvents事件的回调,当用户界面的状态发生改变时会触发AccessibilityEvents事件,例如焦点的变化,点击一个按钮。这个服务可以获取到活动窗口的内容,开发一个辅助功能服务需要继承AccessibilityService并实现其中的抽象方法。

An AccessibilityServiceInfo describes an AccessibilityServiceInfo. The system notifies an AccessibilityService for AccessibilityEvents according to the information encapsulated in this class.
一个AccessibilityService有一个用于描述AccessibilityService的AccessibilityServiceInfo对象,系统会通知AccessibilityService根据AccessibilityServiceInfo把信息装进AccessibilityEvents中。


具体操作看:http://blog.csdn.net/u011965040/article/details/53257005

写得很好,也很仔细


 2、关于adb

adb是根于命令行执行相应的操作,前提是必须有Root权限,才能执行adb命令


模拟点击

execShellCmd("input tap  50 50");              //点击【50,50】那个点
模拟滑动

execShellCmd("input swipe 500 1000 500 600");       
模拟输入

execShellCmd("input text '123132abc'");      //不支持中文,好像可以去下载相应的转码包好像可以,没试过     
模拟点击手机按键

execShellCmd("input keyevent XX");         //后面的值有相应的按键,可到网上查,我就不贴出来了


/** * 执行shell命令 * * @param cmd */private void execShellCmd(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();    } catch (Throwable t) {        t.printStackTrace();    }}




不管是Accessibilityservice还是adb都可以完成自动话操作,但是都有局限性,Accessibilityservice的点击还是滑动是根据空间的 id 或者是 text 来执行,如果有些控件是自定义控件,点击事件不是那么明显,你却想点击怎么办?adb需要坐标,需要去计算。

Accessibilityservice点击是去触发点击,adb是类似于touch事件,


当Accessibilityservice和adb结合起来就可以完美的解决上面的问题,因为Accessibilityservice可以锁定控件,得出控件信息,比如:id text 控件类型 坐标

/** * 得出控件信息---textid * */private void recycle(AccessibilityNodeInfo info) {    if (info.getChildCount() == 0) {                //得出控件上的文字text        Log.i(TAG, "---------------" + info.getText());        //得出控件上的id        Log.i(TAG, "---------------"+ info.getWindowId());        //得出控件的坐标        Rect rect = new Rect();        info.getBoundsInScreen(rect);        Log.i(TAG, "--------" + rect.left + "-----" + rect.top + "-----" + rect.right + "-----" + rect.bottom);    } else {        for (int i = 0; i < info.getChildCount(); i++) {            if (info.getChild(i) != null) {                recycle(info.getChild(i));            }        }    }}

所有信息一目了然,



他是不支持点击的,可以获取坐标点,也是闭区间,可以完美执行点击

Rect rect = new Rect();node.getBoundsInScreen(rect);execShellCmd("input tap " + rect.left + " " + rect.top);              //





原创粉丝点击