本文授权发布公众号【刘桂林】,

今天我简单的来给大家分享一下基于AccessibilityService功能实现智能安装的功能,事实上这个功能在豌豆荚或者其他应用商店应该也是可以看到的,我们来看下截图:
Android 基于AccessibilityService智能安装Apk 仿 豌豆荚_自动安装
Android 基于AccessibilityService智能安装Apk 仿 豌豆荚_模拟点击_02
我们可以看到在豌豆荚的设置里有一个【自动安装应用】的功能,当我点击点击打开的时候就会弹出一个Window来告诉你,可以点击豌豆荚自动装来开启,这就是基本上的流程了,而实现这一辅助功能的关键在于AccessibilityService这个类了

AccessibilityService
AccessibilityService的设计初衷是用来帮助残障人士使用Android设备,所以他又叫无障碍,所以可以用来监听一些页面切换,焦点切换等,之前大热的微信抢红包软件就是用他来实现的,这里我们简单介绍一下他的使用方法:

他的本质也是一个Service,所以我这里新建一个InstanllService继承AccessibilityService并且重写他的两个方法,分别是onAccessibilityEvent接收到系统事件以及onInterrupt服务中断,所以我们可以在这里实现我们的模拟点击,智能安装的实现原理就是这样,启动Apk安装后检测到安装的按钮模拟点击即可,所以我们来看下具体的实现步骤,这里我创建了一个新工程,首先是实现了他的UI:
Android 基于AccessibilityService智能安装Apk 仿 豌豆荚_自动安装_03
这里其实很简单,就是一个Switch和一个Button,进入App后判断是否开启了服务,如果开启了选中,并且我点击按钮就可以自动安装了,所以我们的代码实现如下:
Android 基于AccessibilityService智能安装Apk 仿 豌豆荚_模拟点击_04
这里的逻辑是首先请求一下Sdcard的动态权限,因为我们需要读取内存卡内的Apk,然后就是点击开关判断是否启动了服务,如果没有启动,则跳转到设置,如果已开启服务则直接跳转安装,这里先把代码贴出来:
Android 基于AccessibilityService智能安装Apk 仿 豌豆荚_android_05
开始解释一下这个InstallManager的一些核心代码:

1.使用单例进行封装

2.installSmartApk函数传入的是apk的路径,这里开启了一个子线程去处理,并且判断了当前的服务是否开启,如果没有开启,则调用startInstallService进行开启,如果开启了则调用installLocalApk进行安装

3.startInstallService 跳转系统设置,传统的Intent跳转

4.isStartService 判断服务是否开启,这里利用了ContentProvider读取系统配置表来判断是否存在我们的服务,如果存在则表示服务已开启

5.installLocalApk 安装本地的App,由于FileProvider的限制,所以我们兼容Android 7.0,需要在清单文件中如下配置:
Android 基于AccessibilityService智能安装Apk 仿 豌豆荚_模拟点击_06
并且在res目录下新建一个xml文件夹,再新建一个xml配置文件
Android 基于AccessibilityService智能安装Apk 仿 豌豆荚_自动安装_07

这样才能使用,具体的介绍可以搜索一下了解,当这些都配置好了之后我们就可以继续来看下我们的服务了,也是本文的重头戏了,在此之前,先来看下我们跳转系统设置的样式:

Android 基于AccessibilityService智能安装Apk 仿 豌豆荚_模拟点击_08
这个配置也是在我们服务里配置的,我们先看一下完整的代码,事实上我注释也写的非常的清楚:
Android 基于AccessibilityService智能安装Apk 仿 豌豆荚_android_09

这段代码是很简单的,当我们继承了AccessibilityService之后,我们会重写onAccessibilityEvent
和onInterrupt方法,一个是接收事件所需一个是断开所需,我们在onAccessibilityEvent中中获取到事件的应用处于com.android.packageinstaller,这也是安装程序的包名就继续往下走,先获取当前所有View对象的数量,便于遍历,然后就是正常的判断当前的按钮是否是安装,确定等字样,这只是逻辑部分,具体往下走就是遍历了,每次有事件来,所有的View遍历一遍去模拟点击我需要的按钮,就能实现自动安装了,这里我用Handler延时处理了一下,便于交互体验,当然,代码写好了,我们还需要配置一下:
Android 基于AccessibilityService智能安装Apk 仿 豌豆荚_自动安装_10
可以看到这里也需要我们配置一个xml图片:
Android 基于AccessibilityService智能安装Apk 仿 豌豆荚_模拟点击_11

这里的参数有很多含义,我们来看一下:

description:这是对功能的描述,在设置里体现
packageNames:监听对象的包名
notificationTimeout:接收事件间隔
accessibilityEventTypes:表示可接收的事件类型,这里有很多,滑动,跳转都有
accessibilityFeedbackType:表示反馈方式,可以是语音播放,或者震动
canRetrieveWindowContent:表示该服务能否访问活动窗口中的内容。也就是如果你希望在服务中获取窗体内容,则需要设置其值为true

好了我们可以最终来看下效果:

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

我们可以利用AccessibilityService来做抢红包的插件等小工具,但是这个类正常来说还是不要去使用了,好了,本篇文章到这里就没了。

感谢你在百忙之中看我的文章,谢谢!