自动安装服务2

时间:2022-12-28 01:08:16


今天我们来做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.流程到执行打开流程后将文件删除

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. 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. "下一步");  
40. // 点击“继续安装”节点    
41. "继续安装");    
42. // 点击“安装”节点    
43. "安装");  
44. // 点击“打开”节点    
45. "打开");   
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. 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. 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设置监听窗口的信息与包名

1. private String[] packageNames = { "com.android.packageinstaller", "com.lenovo.security", "com.lenovo.safecenter" };  
2. @Override    
3. protected void onServiceConnected() {    
4. super.onServiceConnected();  
5. 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这个函数

1. @Override    
2. public void onAccessibilityEvent(AccessibilityEvent event) {    
3.     installApplication(event);  
4. }


接下来是操作apk安装,流程是:点击下一步或点击继续安装->点击安装->点击完成->打击打开应用



1. if (event.getSource() != null && isContainInPackages(event.getPackageName().toString())) {  
2.     
3. // 点击“下一步”节点    
4. "下一步");  
5. // 点击“继续安装”节点    
6. "继续安装");    
7. // 点击“安装”节点    
8. "安装");  
9.     
10. // 点击“打开”节点    
11. "打开");    
12.   
13. }


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


1. if (text.equals("打开")) {  
2. new File(Environment.getExternalStorageDirectory() + "/mxtheme/mxtheme.apk");  
3. if (file.exists()) {  
4.          file.delete();  
5.     }  
6. }

源码下载