之前寫了一篇關(guān)于AccessibilityService的學(xué)習(xí)筆記,其中也遇到了關(guān)于Hierarchy View不能連接真機(jī)的問(wèn)題
一般會(huì)報(bào)Unable to get view server version from device XXXXX這個(gè)錯(cuò)誤,而網(wǎng)上的搜索結(jié)果,大多都是從真正的問(wèn)題原因來(lái)解決的這個(gè)問(wèn)題,看了很多,總覺得很繁瑣。
報(bào)這個(gè)錯(cuò)的原因是因?yàn)檫B接Hierarchy View需要一個(gè)view server。而這個(gè)view server只有在工程機(jī),或者調(diào)試機(jī),以及模擬器上才能打開,在發(fā)布的市場(chǎng)版手機(jī),也就是我們的通過(guò)正常渠道買到的手機(jī)是不能開啟這個(gè)服務(wù)的。
通過(guò):adb shell service call window 3 這個(gè)命令可以查看我們的設(shè)備是否開啟該服務(wù)。
若返回值是:Result: Parcel(00000000 00000000 '........')說(shuō)明View Server處于關(guān)閉狀態(tài)
若返回值是:Result: Parcel(00000000 00000001 '........')說(shuō)明View Server處于開啟狀態(tài)
下面介紹一種我認(rèn)為比較笨的辦法來(lái)獲取active window中的view節(jié)點(diǎn)的Id:
1、在啟動(dòng)AccessibilityService配置的時(shí)候,在配置(或xml)文件中添加一個(gè)flag
android:accessibilityFlags="flagReportViewIds"
或:info.flags = AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS;
這個(gè)flag的作用主要是用于之后node.getViewIdResourceName()的權(quán)限。
2、(笨辦法)在window change的時(shí)候,遍歷所有的node,打印出node對(duì)應(yīng)的文字,和id。
這樣就相當(dāng)于變相的繞過(guò)了真機(jī)連接Hierarchy View不成功的問(wèn)題。在找到對(duì)應(yīng)的view的時(shí)候,就可以將這些代碼注釋掉。這樣就可以不管手機(jī)什么ENG模式,還是adb shell balabala....都可以愉快的找到想要操作的view的id啦。