什么是Accessibility
Accessibility是安卓的一套内置功能,它常被翻译为辅助功能,或无障碍服务
它通过一系列的功能,来对有系统使用障碍的用户群体进行帮助
它可以帮助用户更方便地进行阅读、触控、听声音等
我们可以自定义一个自己的服务,继承自AccessibilityService
重写其中的onAccessibilityEvent方法,来指定如何对用户进行帮助
通过Accessibility进行安装的原理
Accessibility服务在经过授权后,可以对屏幕内容进行抓取识别
我们判断出屏幕内容后,再进行自动点击,就可以达到自动安装的目的
所以,通过Accessibility进行安装,本质上是模拟用户触发点击事件
自定义AccessibilityService
我们自定义一个AccessibilityService,用于帮助用户自动点击
import android.accessibilityservice.AccessibilityService;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import com.easing.commons.android.code.Console;
import java.util.List;
//APK自动安装服务
public class AutoInstallService extends AccessibilityService {
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
//只处理安装事件
if (event != null && !event.getPackageName().toString().contains("packageinstaller"))
return;
Console.info("AutoInstallService", "onAccessibilityEvent");
//特殊情况不处理
AccessibilityNodeInfo eventNode = event.getSource();
if (eventNode == null)
return;
//特殊情况不处理
AccessibilityNodeInfo windowNode = getRootInActiveWindow();
if (windowNode == null)
return;
//自动点击
findTextAndClick(windowNode, "允许");
findTextAndClick(windowNode, "安装");
findTextAndClick(windowNode, "继续安装");
findTextAndClick(windowNode, "下一步");
findTextAndClick(windowNode, "打开");
//回收对象
eventNode.recycle();
windowNode.recycle();
}
@Override
protected void onServiceConnected() {
Console.info("AutoInstallService", "onServiceConnected");
super.onServiceConnected();
}
@Override
public void onInterrupt() {
Console.info("AutoInstallService", "onInterrupt");
}
//找到指定文字的按钮,并自动点击
protected void findTextAndClick(AccessibilityNodeInfo nodeInfo, String text) {
List nodes = nodeInfo.findAccessibilityNodeInfosByText(text);
if (nodes == null || nodes.isEmpty())
return;
for (AccessibilityNodeInfo node : nodes)
if (node.isEnabled() && node.isClickable() && (node.getClassName().equals("android.widget.Button") || node.getClassName().equals("android.widget.CheckBox")))
node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
}
注册AccessibilityService
在Manifest中添加以下代码
在res/xml下新建一个accessibility_config.xml
启用自定义的AccessibilityService
startActivity(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS));
注意事项
有些定制的硬件,由于性能问题,对很多系统服务进行了限制或阉割,可能会导致AccessibilityService无法使用
可以自己多找几个手机试试,如果是手机问题,就不要多浪费时间了