天天看點

如何使用 AccessibilityService 查找元素如何使用 AccessibilityService 查找元素

如何使用 AccessibilityService 查找元素

如果還不了解 AccessibilityService ,先看下這篇:如何使用 AccessibilityService 實作螞蟻森林自動收取能量,無需Root,無需連接配接電腦

這裡介紹的是用 AccessibilityService 查找元素,可以查找有

1.Id: 也就是我們在xml檔案裡定義的@+id/xx
2.Text: TextView,Button等View裡面内容
3.ContentDescription: 一般View為了無障礙設定的描述,還有很多WebView裡面的View顯示文字也是用ContentDescription
4.ClassName: 就是View的Class名字,可以找ListView,ViewPager等不常見,一個View裡隻有一個的

這裡我用的是一個叫 Auto.js 的工具來看一個View的元素,自己也一直想實作一個,實在懶,還沒動工

Auto.js git位址

伸手黨這裡直接打包了一個debug包

首先看下 Id 是怎麼找的吧,下面用的是支付寶裡面的内容,螞蟻森林這個View的所有屬性

如何使用 AccessibilityService 查找元素如何使用 AccessibilityService 查找元素

他的fullId就是相應的全部的 id 了,隻要查找就能找到

下面是查找 Id 的源碼,其實可以 AccessibilityNodeInfo 直接查找Id的方式查找

List<AccessibilityNodeInfo> list = root.findAccessibilityNodeInfosByViewId(mCheckData);
if (Utils.isEmptyArray(list)) {
    return null;
}
for (int i = 1; i < list.size(); i++) {//其他的均回收
    list.get(i).recycle();
}
return list.get(0);
           

上面的“螞蟻森林”元素,其實也可以通過查找 Text 的方式找到

下面是查找 Text 的源碼,也可以 AccessibilityNodeInfo 直接找Text的方式查找

List<AccessibilityNodeInfo> list = root.findAccessibilityNodeInfosByText(mCheckData);
if (Utils.isEmptyArray(list)) {
    return null;
}

AccessibilityNodeInfo returnInfo = null;
for (AccessibilityNodeInfo info : list) {
    if (mCheckData.equals(info.getText().toString())) {
        returnInfo = info;
    } else {
        info.recycle();
    }
}
return returnInfo;
           

再來看下 ContentDescription 是在哪裡的吧

如何使用 AccessibilityService 查找元素如何使用 AccessibilityService 查找元素

下面是查找 ContentDescription 的源碼,通過遞歸的方式找ContentDescription

CharSequence text = thisInfo.getContentDescription();
return text != null && text.toString().equals(mCheckData);
           
如何使用 AccessibilityService 查找元素如何使用 AccessibilityService 查找元素
如何使用 AccessibilityService 查找元素如何使用 AccessibilityService 查找元素
如何使用 AccessibilityService 查找元素如何使用 AccessibilityService 查找元素

下面是查找 WebText 和 ClassName 的源碼,都是通過遞歸的方式找的

// WebText是
CharSequence text = thisInfo.getText();
return text != null && text.toString().equals(mCheckData);


// ClassName 查找
return thisInfo.getClassName().toString().equals(mCheckData);
           

最後附上完整demo的位址,裡面封裝了所有查找元素的方法,還根據自動領取螞蟻森林舉了個例子:螞蟻森林自動領取能量