使用AccessibilityService带你自动安装软件以及自动添加微信好友

今天我们来做apk自动安装和微信自动添加好友。自动安装功能我们需要监听每个手机的安装app包名,安装app包名是下载好apk后手机系统会默认打开文件进入安装界面的应用,也就是说这个安装界面也是属于某个应用的,那么它必须有一个包名,大部分手机的安装包名都是:com.android.packageinstaller,剩下的还有一些不同的,所以我们监听的包名要有多个包名:com.lenovo.security,com.lenovo.safecenter.
现在我们配置AccessibilityService,如果你对AccessibilityService这个不熟悉的话可以先看看 《AccessibilityService详解》。

apk自动安装执行步骤:
1.配置监控安装应用:com.android.packageinstaller、com.lenovo.security、com.lenovo.safecenter
2.界面调用时候回调onAccessibilityEvent,在onAccessibilityEvent这个函数我们要执行安装流程,首先执行下一步或继续安装,执行安装,执行打开
3.流程到执行打开流程后将文件删除
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();
	}
}
源码下载





你可能感兴趣的:(使用AccessibilityService带你自动安装软件以及自动添加微信好友)