今天我们来做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. }