今天我简单的来给大家分享一下基于AccessibilityService功能实现智能安装的功能,事实上这个功能在豌豆荚或者其他应用商店应该也是可以看到的,我们来看下截图:



android 无障碍 模拟 android无障碍服务 模拟点击_模拟点击


android 无障碍 模拟 android无障碍服务 模拟点击_模拟点击_02


我们可以看到在豌豆荚的设置里有一个【自动安装应用】的功能,当我点击点击打开的时候就会弹出一个Window来告诉你,可以点击豌豆荚自动装来开启,这就是基本上的流程了,而实现这一辅助功能的关键在于AccessibilityService这个类了

AccessibilityService

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

他的本质也是一个Service,所以我这里新建一个InstanllService继承AccessibilityService并且重写他的两个方法,分别是onAccessibilityEvent接收到系统事件以及onInterrupt服务中断,所以我们可以在这里实现我们的模拟点击,智能安装的实现原理就是这样,启动Apk安装后检测到安装的按钮模拟点击即可,所以我们来看下具体的实现步骤,这里我创建了一个新工程,首先是实现了他的UI:


android 无障碍 模拟 android无障碍服务 模拟点击_模拟点击_03


这里其实很简单,就是一个Switch和一个Button,进入App后判断是否开启了服务,如果开启了选中,并且我点击按钮就可以自动安装了,所以我们的代码实现如下:


android 无障碍 模拟 android无障碍服务 模拟点击_模拟点击_04


这里的逻辑是首先请求一下Sdcard的动态权限,因为我们需要读取内存卡内的Apk,然后就是点击开关判断是否启动了服务,如果没有启动,则跳转到设置,如果已开启服务则直接跳转安装,这里先把代码贴出来:


android 无障碍 模拟 android无障碍服务 模拟点击_android震动代码_05


开始解释一下这个InstallManager的一些核心代码:

1.使用单例进行封装

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

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

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

5.installLocalApk 安装本地的App,由于FileProvider的限制,所以我们兼容Android 7.0,需要在清单文件中如下配置:


android 无障碍 模拟 android无障碍服务 模拟点击_模拟点击_06


并且在res目录下新建一个xml文件夹,再新建一个xml配置文件


android 无障碍 模拟 android无障碍服务 模拟点击_模拟点击_07


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


android 无障碍 模拟 android无障碍服务 模拟点击_自动安装_08


这个配置也是在我们服务里配置的,我们先看一下完整的代码,事实上我注释也写的非常的清楚:


android 无障碍 模拟 android无障碍服务 模拟点击_自动安装_09


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


android 无障碍 模拟 android无障碍服务 模拟点击_自动安装_10


可以看到这里也需要我们配置一个xml


android 无障碍 模拟 android无障碍服务 模拟点击_模拟点击_11


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

description:这是对功能的描述,在设置里体现

packageNames:监听对象的包名

notificationTimeout:接收事件间隔

accessibilityEventTypes:表示可接收的事件类型,这里有很多,滑动,跳转都有

accessibilityFeedbackType:表示反馈方式,可以是语音播放,或者震动

canRetrieveWindowContent:是否获取窗体内容

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


android 无障碍 模拟 android无障碍服务 模拟点击_android震动代码_12


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