原理:1、当有apk安装时,包名为com.android.packageinstaller的apk会弹出安装授权框,会引起界面窗口的变化

2.AccessbilityService可以监听到界面窗口的变化

步骤:

1.写一个类继承AccessibilityService并重写相关方法,在方法onAccessibilityEvent中监听窗口事件的变化

AccessibilityNodeInfo rootNode = getRootInActiveWindow();   //获取窗口

int count = rootNode.getChildCount();      //获取组件的数目

List<AccessibilityNodeInfo> nodeInfos = nodeInfo1.findAccessibilityNodeInfosByText("下一步");  //安装文字内容查找控件

accessibilityNodeInfo.getClassName()            //获取组件的名称

accessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);   //执行点击事件

代码如下:

package com.example.zjhl.myapplication;import android.accessibilityservice.AccessibilityService;
import android.annotation.TargetApi;
import android.app.KeyguardManager;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.Context;
import android.os.Build;
import android.os.PowerManager;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.Toast;import java.util.List;/*** Created by zjhl on 2017/10/28.*/
public class AutoReplyService extends AccessibilityService {private boolean canGet = false;//能否点击红包private boolean enableKeyguard = true;//默认有屏幕锁//窗口状态private static final int WINDOW_NONE = 0;private static final int WINDOW_LAUNCHER = 3;//当前窗口private int mCurrentWindow = WINDOW_NONE;//锁屏、解锁相关private KeyguardManager km;private KeyguardManager.KeyguardLock kl;//唤醒屏幕相关private PowerManager pm;private PowerManager.WakeLock wl = null;private boolean isInstall;//唤醒屏幕和解锁private void wakeAndUnlock(boolean unLock) {if (unLock) {//若为黑屏状态则唤醒屏幕if (!pm.isScreenOn()) {//获取电源管理器对象,ACQUIRE_CAUSES_WAKEUP这个参数能从黑屏唤醒屏幕wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "bright");//点亮屏幕wl.acquire();}//若在锁屏界面则解锁直接跳过锁屏if (km.inKeyguardRestrictedInputMode()) {//设置解锁标志,以判断抢完红包能否锁屏enableKeyguard = false;//解锁kl.disableKeyguard();}} else {//如果之前解过锁则加锁以恢复原样if (!enableKeyguard) {//锁屏kl.reenableKeyguard();}//若之前唤醒过屏幕则释放之使屏幕不保持常亮if (wl != null) {wl.release();wl = null;}}}@TargetApi(Build.VERSION_CODES.JELLY_BEAN)@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {int eventType = event.getEventType();System.out.println("onAccessibilityEvent..............................."+eventType);switch (eventType) {//第一步:监听通知栏消息case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:System.out.println("onAccessibilityEvent.......................................TYPE_NOTIFICATION_STATE_CHANGED.");break;//第二步:监听是否进入apk安装界面case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:System.out.println("TYPE_WINDOW_STATE_CHANGED...............................");AccessibilityNodeInfo rootNode = getRootInActiveWindow();if (rootNode != null) {int count = rootNode.getChildCount();for (int i = 0; i < count; i++) {final AccessibilityNodeInfo nodeInfo = rootNode.getChild(i);if (nodeInfo == null) {continue;}System.out.println("nodeInfo.getClassName.............................." + nodeInfo.getClassName());new Thread(new Runnable() {@Overridepublic void run() {clickNode(nodeInfo);}}).start();}}break;case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED:System.out.println("onAccessibilityEvent.......................................TYPE_WINDOW_CONTENT_CHANGED");break;}}private void clickNode(AccessibilityNodeInfo nodeInfo) {//“下一步”和“安装”都是buttonif ("android.widget.Button".equals(nodeInfo.getClassName()) && !isInstall) {isInstall = true;System.out.println("TYPE_WINDOW_STATE_CHANGED...............................1");AccessibilityNodeInfo nodeInfo1 = getRootInActiveWindow();System.out.println("TYPE_WINDOW_STATE_CHANGED...............................2");if (nodeInfo1 != null) {System.out.println("TYPE_WINDOW_STATE_CHANGED...............................3");//找到"下一步"List<AccessibilityNodeInfo> nodeInfos = nodeInfo1.findAccessibilityNodeInfosByText("下一步");System.out.println("下一步.................................");if (nodeInfos.size() == 0) {nodeInfos = nodeInfo1.findAccessibilityNodeInfosByText("安装");System.out.println("安装.................................");if (nodeInfos.size() == 0) {System.out.println("完成.................................");nodeInfos = nodeInfo1.findAccessibilityNodeInfosByText("完成");}}System.out.println("TYPE_WINDOW_STATE_CHANGED...............................4..." + nodeInfos.size());for (int j = 0; j < nodeInfos.size(); j++) {System.out.println("recycle.................................." + j);AccessibilityNodeInfo accessibilityNodeInfo = nodeInfos.get(j);System.out.println("TYPE_WINDOW_STATE_CHANGED...............................5..." + accessibilityNodeInfo.getClassName());//找到图片最外层的位置
//                    if (!isInstall) {if ("android.widget.Button".equals(accessibilityNodeInfo.getClassName())) {accessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);System.out.println("TYPE_WINDOW_STATE_CHANGED...............................clicked...");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}isInstall = false;clickNode(nodeInfo);break;}}}}}@Overridepublic void onInterrupt() {System.out.println("onInterrupt.............................");}@Overrideprotected void onServiceConnected() {super.onServiceConnected();Log.i("demo", "开启");System.out.println("onServiceConnected.......................................");//获取电源管理器对象pm = (PowerManager) getSystemService(Context.POWER_SERVICE);//得到键盘锁管理器对象km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);//初始化一个键盘锁管理器对象kl = km.newKeyguardLock("unLock");Toast.makeText(this, "_已开启应用自动安装服务_", Toast.LENGTH_LONG).show();}@Overridepublic void onDestroy() {super.onDestroy();System.out.println("onDestroy.......................................");Log.i("demo", "关闭");wakeAndUnlock(false);Toast.makeText(this, "_已关闭应用自动安装服务_", Toast.LENGTH_LONG).show();}}

2.在配置文件中进行服务的配置

   <serviceandroid:name=".AutoReplyService"android:enabled="true"android:exported="true"android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"><intent-filter><action android:name="android.accessibilityservice.AccessibilityService"/></intent-filter><meta-dataandroid:name="android.accessibilityservice"android:resource="@xml/auto_reply_service_config"/></service>

3.在res的xml文件夹下配置文件auto_reply_service_config.xml

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged"android:accessibilityFeedbackType="feedbackGeneric"android:accessibilityFlags="flagDefault"android:canRetrieveWindowContent="true"android:notificationTimeout="100"android:packageNames="com.tencent.mobileqq,com.android.packageinstaller"/><!--android:packageNames="com.example.zjhl.myapplication,com.UCMobile,com.wandoujia.phoenix2,com.wandoujia.phoenix2.usbproxy,eu.chainfire.supersu,com.mediatek.voiceunlock,com.kingouser.com.fragment" -->

4.运行后在辅助功能中手动开启服务MyAccessibilityApplication服务,直接运行后当有apk安装时会自动模拟点击

Android辅助功能之自动安装apk相关推荐

  1. android.os.FileUriExposedException 自动安装APK报错 5分钟搞定Android 7.0+ FileProvider

    android.os.FileUriExposedException 自动安装APK报错  5分钟搞定Android 7.0+ FileProvider 适配步骤: 1. 创建file_paths.x ...

  2. Android免Root自动安装apk

    效果 GitHub 参考文章 添加权限 在清单文件里注册service 配置文件 自定义服务 自定义服务中的字符串 总结 效果 要开启辅助功能并且,并且android版本在api-14或者以上. Gi ...

  3. appium自动化脚本之自动安装apk包到手机

    Appium基础篇3-第一个appium自动化脚本之自动安装apk包到手机 这篇,我们开始来一个实战练习,如何通过appium自动把电脑上一个安卓程序包给安装到一台安卓手机中.在写脚本之前,我们需要统 ...

  4. python自动安装apk文件

    最近在学习python,在前一段时间用dos写了一脚本,自动安装apk文件,于是也试着用python写了一这样的脚本. dos脚本地址:http://blog.csdn.net/lyhdream/ar ...

  5. Android 7.0下载安装APK

    Android 7.0下载安装APK 这里只说安装,不说下载.因为下载网上一搜一大堆,暂且说下一下Android7.0 下载安装APK时的兼容性问题. 简介 随着Android版本越来越高,Andro ...

  6. android下载完成不能自动安装失败,android 8.0以上自动安装apk失败的解决问题

    随着android 系统的不断更新和发展,针对应用的权限管理也是越来越严格.这可是坑坏了我们这些搬砖的程序员,因为在一些上架平台,都一一宣布,以后的android应用 targetSdkVersion ...

  7. Android-Accessibility(辅助功能/无障碍,自动安装APP)

    参考: http://www.infoq.com/cn/articles/android-accessibility-installing https://developer.android.com/ ...

  8. Android 基于AccessibilityService智能安装Apk 仿 豌豆荚

    本文授权发布公众号[刘桂林],星球[Hi Android] 今天我简单的来给大家分享一下基于AccessibilityService功能实现智能安装的功能,事实上这个功能在豌豆荚或者其他应用商店应该也 ...

  9. 【转】Android-Accessibility(辅助功能/无障碍,自动安装APP)

    参考: http://www.infoq.com/cn/articles/android-accessibility-installing https://developer.android.com/ ...

  10. 通过批处理文件自动安装apk到手机

    有时候因为工作的需要,要在Android手机上安装很多个apk,手动安装太麻烦,于是写了一dos脚本,让其制动安装 前提条件:电脑中有adb.exe文件,并且为其配置好了路径(将其添加到了环境变量PA ...

最新文章

  1. Thrift的服务器和客户端Python案例
  2. Linux内核如何管理内存
  3. JS数据结构与算法——冒泡排序(把大的数字依次往后放)
  4. 单词方阵(洛谷-P1101)
  5. 解决CUDA driver version is insufficient for CUDA runtime version
  6. 【clickhouse】ClickHouse之DBA运维宝典
  7. Python扩展库numpy中的布尔运算
  8. 软工实践Alpha冲刺(6/10)
  9. 计算机技能高考带什么文具,高考必备——21条考场抓分细节
  10. 给机器学习面试者的十项建议 | 面试官角度
  11. 使用 docker-pan 一键搭建可离线磁力种子的私有云盘
  12. 迷宫游戏|自动寻径|随机生成迷宫地图|UI|闯关|地图反转
  13. 高中数学竞赛与自主招生内部练习试题
  14. numpy和pandas简单使用
  15. unity 阿拉伯文显示
  16. 不改变图片分辨率,减少图片存储大小
  17. ACLSCO链路介绍
  18. json数据和字符串json数据相互转换
  19. 电路模型和电路定律(Ⅰ)
  20. 回顾6年深度学习算法实践和演进

热门文章

  1. Linux操作系统 —— 普通用户无权限执行命令怎么办
  2. java邮件增加签名_Java对文件添加数字签名
  3. 单纯同调与奇异同调 习题
  4. mysql ndb安装_MySQL NDB Cluster 安装文档-基于CentOS7搭建
  5. 用RotateDrawable实现网易云音乐唱片机效果
  6. C# WPF 低仿网易云音乐(PC)歌词控件
  7. 打印excel html js,前端js打印(导出)excel表格的方法实例
  8. DI高速计数器编码器脉冲计数器PNPNPN输入模块高低电平
  9. Axure制作幻灯片轮播案例
  10. EMCP  物联网云平台萤石云密钥功能使用手册