AccessibilityService 获取View的Id

之前写了一篇关于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啦。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Banner 基本上所有的App首页都包含一个轮播器,一般称之为Banner。通过这一个组件可以实现以下几个功能:...
    狮_子歌歌阅读 1,628评论 0 2
  • Correctness AdapterViewChildren Summary: AdapterViews can...
    MarcusMa阅读 8,926评论 0 6
  • Hierarchy View 在Android SDK里自带,常用来查看界面的视图结构是否过于复杂,用于了解哪些视...
    Mr丶JAL阅读 1,476评论 0 1
  • 十月初八,长安城内。 小雨淅淅沥沥的下着,有的人在等雨伞,有的人在等雨停。 而我端坐的在小酒馆里,自斟自饮,听着旁...
    洛子风阅读 1,724评论 2 3
  • 某日,去看望一个刚生完二胎不久的朋友。 正在房间聊得开心,忽然听见客厅传来“嘭”的一声响,接着就听见碎裂的声音。 ...
    杰出谷阅读 745评论 0 0