public class IAccessbilityService extends AccessibilityService { // 大多数的手机包名一样,联想部分机型的手机不一样 private String[] packageNames = { "com.android.packageinstaller", "com.lenovo.security", "com.lenovo.safecenter" }; /** * 此方法是accessibility service的配置信息 写在java类中是为了向下兼容 */ @Override protected void onServiceConnected() { super.onServiceConnected(); AccessibilityServiceInfo mAccessibilityServiceInfo = new AccessibilityServiceInfo(); // 响应事件的类型,这里是全部的响应事件(长按,单击,滑动等) mAccessibilityServiceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK; // 反馈给用户的类型,这里是语音提示 mAccessibilityServiceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN; // 过滤的包名 mAccessibilityServiceInfo.packageNames = packageNames; setServiceInfo(mAccessibilityServiceInfo); } @Override public void onAccessibilityEvent(AccessibilityEvent event) { installApplication(event); } @Override public void onInterrupt() { } /** * 查找关键字并执行点击按钮的操作 * * @param event */ private void installApplication(AccessibilityEvent event) { if (event.getSource() != null && isContainInPackages(event.getPackageName().toString())) { // 点击“下一步”节点 findNodesByText(event, "下一步"); // 点击“继续安装”节点 findNodesByText(event, "继续安装"); // 点击“安装”节点 findNodesByText(event, "安装"); // 点击“打开”节点 findNodesByText(event, "打开"); } } /** * 判断包名 * * @param str * 当前界面包名 * @return */ private boolean isContainInPackages(String str) { boolean flag = false; for (int i = 0; i < packageNames.length; i++) { if ((packageNames[i]).equals(str)) { flag = true; return flag; } } return flag; } /** * 根据文字寻找节点 * * @param event * @param text * 文字 */ private void findNodesByText(AccessibilityEvent event, String text) { List<AccessibilityNodeInfo> nodes = event.getSource().findAccessibilityNodeInfosByText(text); if (nodes != null && !nodes.isEmpty()) { for (AccessibilityNodeInfo info : nodes) { if (info.isClickable()) {// 只有根据节点信息是下一步,安装,完成,打开,且是可以点击的时候,才执行后面的点击操作 if (text.equals("打开")) { File file = new File(Environment.getExternalStorageDirectory() + "/mxtheme/mxtheme.apk"); if (file.exists()) { file.delete(); } else { info.performAction(AccessibilityNodeInfo.ACTION_CLICK); } } } } } } }这个类主要的作用是当服务被打开后调用onServiceConnected函数然后setServiceInfo设置监听窗口的信息与包名
private String[] packageNames = { "com.android.packageinstaller", "com.lenovo.security", "com.lenovo.safecenter" }; @Override protected void onServiceConnected() { super.onServiceConnected(); AccessibilityServiceInfo mAccessibilityServiceInfo = new AccessibilityServiceInfo(); // 响应事件的类型,这里是全部的响应事件(长按,单击,滑动等) mAccessibilityServiceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK; // 反馈给用户的类型,这里是语音提示 mAccessibilityServiceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN; // 过滤的包名 mAccessibilityServiceInfo.packageNames = packageNames; setServiceInfo(mAccessibilityServiceInfo); }监听到安装包被安装的时候就会被调用onAccessibilityEvent这个函数
@Override public void onAccessibilityEvent(AccessibilityEvent event) { installApplication(event); }接下来是操作apk安装,流程是:点击下一步或点击继续安装->点击安装->点击完成->打击打开应用
if (event.getSource() != null && isContainInPackages(event.getPackageName().toString())) { // 点击“下一步”节点 findNodesByText(event, "下一步"); // 点击“继续安装”节点 findNodesByText(event, "继续安装"); // 点击“安装”节点 findNodesByText(event, "安装"); // 点击“打开”节点 findNodesByText(event, "打开"); }
当点击打开节点时则表示安装已完成那么我们应该要把apk删除
if (text.equals("打开")) { File file = new File(Environment.getExternalStorageDirectory() + "/mxtheme/mxtheme.apk"); if (file.exists()) { file.delete(); } }源码下载