之前写了一篇关于AccessibilityService的学习笔记,其中也遇到了关于Hierarchy View不能连接真机的问题
一般会报Unable to get view server version from device XXXXX这个错误,而网上的搜索结果,大多都是从真正的问题原因来解决的这个问题,看了很多,总觉得很繁琐。
报这个错的原因是因为连接Hierarchy View需要一个view server。而这个view server只有在工程机,或者调试机,以及模拟器上才能打开,在发布的市场版手机,也就是我们的通过正常渠道买到的手机是不能开启这个服务的。
通过:adb shell service call window 3 这个命令可以查看我们的设备是否开启该服务。
若返回值是:Result: Parcel(00000000 00000000 '........')说明View Server处于关闭状态
若返回值是:Result: Parcel(00000000 00000001 '........')说明View Server处于开启状态
下面介绍一种我认为比较笨的办法来获取active window中的view节点的Id:
1、在启动AccessibilityService配置的时候,在配置(或xml)文件中添加一个flag
android:accessibilityFlags="flagReportViewIds"
或:info.flags = AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS;
这个flag的作用主要是用于之后node.getViewIdResourceName()的权限。
2、(笨办法)在window change的时候,遍历所有的node,打印出node对应的文字,和id。
这样就相当于变相的绕过了真机连接Hierarchy View不成功的问题。在找到对应的view的时候,就可以将这些代码注释掉。这样就可以不管手机什么ENG模式,还是adb shell balabala....都可以愉快的找到想要操作的view的id啦。
网友评论