zl程序教程

您现在的位置是:首页 >  其他

当前栏目

自动安装服务2

2023-09-27 14:27:46 时间
今天我们来做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.流程到执行打开流程后将文件删除
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class IAccessbilityService extends AccessibilityService {    
  2.     // 大多数的手机包名一样,联想部分机型的手机不一样    
  3.     private String[] packageNames = { "com.android.packageinstaller""com.lenovo.security""com.lenovo.safecenter" };  
  4.   
  5.     /**   
  6.      * 此方法是accessibility service的配置信息 写在java类中是为了向下兼容   
  7.      */    
  8.     @Override    
  9.     protected void onServiceConnected() {    
  10.         super.onServiceConnected();  
  11.         AccessibilityServiceInfo mAccessibilityServiceInfo = new AccessibilityServiceInfo();    
  12.         // 响应事件的类型,这里是全部的响应事件(长按,单击,滑动等)    
  13.         mAccessibilityServiceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;    
  14.         // 反馈给用户的类型,这里是语音提示    
  15.         mAccessibilityServiceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;    
  16.         // 过滤的包名    
  17.         mAccessibilityServiceInfo.packageNames = packageNames;  
  18.         setServiceInfo(mAccessibilityServiceInfo);  
  19.     }  
  20.   
  21.     @Override    
  22.     public void onAccessibilityEvent(AccessibilityEvent event) {    
  23.         installApplication(event);  
  24.     }  
  25.   
  26.     @Override    
  27.     public void onInterrupt() {    
  28.     
  29.     }  
  30.   
  31.     /**   
  32.      * 查找关键字并执行点击按钮的操作   
  33.      *    
  34.      * @param event   
  35.      */  
  36.     private void installApplication(AccessibilityEvent event) {  
  37.      if (event.getSource() != null && isContainInPackages(event.getPackageName().toString())) {    
  38.              // 点击“下一步”节点    
  39.              findNodesByText(event, "下一步");  
  40.              // 点击“继续安装”节点    
  41.              findNodesByText(event, "继续安装");    
  42.              // 点击“安装”节点    
  43.              findNodesByText(event, "安装");  
  44.              // 点击“打开”节点    
  45.              findNodesByText(event, "打开");   
  46.         }  
  47.     }  
  48.   
  49.     /**   
  50.      * 判断包名   
  51.      *    
  52.      * @param str   
  53.      *            当前界面包名   
  54.      * @return   
  55.      */    
  56.     private boolean isContainInPackages(String str) {    
  57.         boolean flag = false;    
  58.         for (int i = 0; i < packageNames.length; i++) {    
  59.             if ((packageNames[i]).equals(str)) {    
  60.                 flag = true;    
  61.                 return flag;    
  62.             }    
  63.         }    
  64.         return flag;    
  65.     }  
  66.   
  67.     /**   
  68.      * 根据文字寻找节点   
  69.      *    
  70.      * @param event   
  71.      * @param text   
  72.      *            文字   
  73.      */  
  74.      private void findNodesByText(AccessibilityEvent event, String text) {    
  75.         List<AccessibilityNodeInfo> nodes = event.getSource().findAccessibilityNodeInfosByText(text);    
  76.     
  77.         if (nodes != null && !nodes.isEmpty()) {    
  78.             for (AccessibilityNodeInfo info : nodes) {    
  79.                 if (info.isClickable()) {// 只有根据节点信息是下一步,安装,完成,打开,且是可以点击的时候,才执行后面的点击操作    
  80.                     if (text.equals("打开")) {  
  81.             File file = new File(Environment.getExternalStorageDirectory() + "/mxtheme/mxtheme.apk");  
  82.             if (file.exists()) {  
  83.                 file.delete();  
  84.             } else {  
  85.                             info.performAction(AccessibilityNodeInfo.ACTION_CLICK);  
  86.                         }  
  87.                      }  
  88.                  }  
  89.             }  
  90.         }  
  91.     }  
  92.   
  93. }  
 
这个类主要的作用是当服务被打开后调用onServiceConnected函数然后setServiceInfo设置监听窗口的信息与包名 
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. private String[] packageNames = { "com.android.packageinstaller""com.lenovo.security""com.lenovo.safecenter" };  
  2. @Override    
  3. protected void onServiceConnected() {    
  4.     super.onServiceConnected();  
  5.     AccessibilityServiceInfo mAccessibilityServiceInfo = new AccessibilityServiceInfo();    
  6.     // 响应事件的类型,这里是全部的响应事件(长按,单击,滑动等)    
  7.     mAccessibilityServiceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;    
  8.     // 反馈给用户的类型,这里是语音提示    
  9.     mAccessibilityServiceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;    
  10.     // 过滤的包名    
  11.     mAccessibilityServiceInfo.packageNames = packageNames;  
  12.     setServiceInfo(mAccessibilityServiceInfo);  
  13. }  
监听到安装包被安装的时候就会被调用onAccessibilityEvent这个函数
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. @Override    
  2. public void onAccessibilityEvent(AccessibilityEvent event) {    
  3.     installApplication(event);  
  4. }  
接下来是操作apk安装,流程是:点击下一步或点击继续安装->点击安装->点击完成->打击打开应用
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. if (event.getSource() != null && isContainInPackages(event.getPackageName().toString())) {  
  2.     
  3.     // 点击“下一步”节点    
  4.     findNodesByText(event, "下一步");  
  5.     // 点击“继续安装”节点    
  6.     findNodesByText(event, "继续安装");    
  7.     // 点击“安装”节点    
  8.     findNodesByText(event, "安装");  
  9.     
  10.     // 点击“打开”节点    
  11.     findNodesByText(event, "打开");    
  12.   
  13. }  

当点击打开节点时则表示安装已完成那么我们应该要把apk删除

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. if (text.equals("打开")) {  
  2.     File file = new File(Environment.getExternalStorageDirectory() + "/mxtheme/mxtheme.apk");  
  3.     if (file.exists()) {  
  4.          file.delete();  
  5.     }  
  6. }  
源码下载