如何使用 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的元素,自己也一直想实现一个,实在懒,还没动工
首先看下 Id 是怎么找的吧,下面用的是支付宝里面的内容,蚂蚁森林这个View的所有属性
他的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 是在哪里的吧
下面是查找 ContentDescription 的源码,通过递归的方式找ContentDescription
CharSequence text = thisInfo.getContentDescription();
return text != null && text.toString().equals(mCheckData);
下面是查找 WebText 和 ClassName 的源码,都是通过递归的方式找的
// WebText是
CharSequence text = thisInfo.getText();
return text != null && text.toString().equals(mCheckData);
// ClassName 查找
return thisInfo.getClassName().toString().equals(mCheckData);
最后附上完整demo的地址,里面封装了所有查找元素的方法,还根据自动领取蚂蚁森林举了个例子:蚂蚁森林自动领取能量