博客
关于我
自动安装服务2
阅读量:345 次
发布时间:2019-03-04

本文共 3944 字,大约阅读时间需要 13 分钟。

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

现在我们配置AccessibilityService,如果你对AccessibilityService这个不熟悉的话可以先看看


apk自动安装执行步骤:

1.配置监控安装应用:com.android.packageinstaller、com.lenovo.security、com.lenovo.safecenter

2.界面调用时候回调onAccessibilityEvent,在onAccessibilityEvent这个函数我们要执行安装流程,首先执行下一步或继续安装,执行安装,执行打开

3.流程到执行打开流程后将文件删除

[java]   
 
  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]   
 
  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]   
 
  1. @Override    
  2. public void onAccessibilityEvent(AccessibilityEvent event) {    
  3.     installApplication(event);  
  4. }  
接下来是操作apk安装,流程是:点击下一步或点击继续安装->点击安装->点击完成->打击打开应用

[java]   
 
  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]   
 
  1. if (text.equals("打开")) {  
  2.     File file = new File(Environment.getExternalStorageDirectory() + "/mxtheme/mxtheme.apk");  
  3.     if (file.exists()) {  
  4.          file.delete();  
  5.     }  
  6. }  

转载地址:http://mjpr.baihongyu.com/

你可能感兴趣的文章
王爽 《汇编语言》 读书笔记 三 寄存器(内存访问)
查看>>
IDEA/eclipse集成阿里巴巴Java开发规约插件
查看>>
IDEA出现问题:Received fatal alert: protocol_version 解决方案
查看>>
IDEA出现问题:修改jsp页面tomcat不生效解决方案
查看>>
docker出现问题:You cannot remove a running container 解决方案
查看>>
IDEA 热部署太热情不好(失去焦点就热部署)
查看>>
IDEA2020-2配置git,并从远程仓库获取代码分支
查看>>
IDEA快速恢复开发:导出配置和导入配置操作
查看>>
Java Socket网络编程-总结
查看>>
Linux通过yum仓库安装gcc详细教程
查看>>
加油站(贪心)
查看>>
最长的连续元素序列长度(哈希表)
查看>>
访问docker中的nginx容器部署
查看>>
LNMP环境搭建
查看>>
Airtest自动化测试 Docs airtest.core.android package
查看>>
SVN Unable to connect to a repository at URL 的解决方案
查看>>
PostgreSQL 分区表探索(pg_pathman)数据库优化
查看>>
设计一个验证系统
查看>>
ubuntu 安装 vncserver
查看>>
centos7防火墙导致nginx无法访问
查看>>