本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布
工作中我们需要自制一套工具,其中遇到需要模拟点击事件的需求,类似按键精灵的功能,支持后台持续运行,满足触发条件时完成点击。
经过一番探索,一共整理出两种不同的方案:AccessibilityService
和 adb shell
命令,读者可自行选择合适的场景。
AccessibilityService
无障碍模式是我首先想到的方案,对于不知道Android无障碍模式的,可自行百度。这里简单说明一下,AccessibilityService
是Android为残障人士提供的贴心功能,比如可以报出当前页面有哪些按钮balabala。使用官方提供的一些列API,我们还可以完成一些自动运行的“黑科技”操作,比如早些年的红包插件、微信自动回复插件、自动点赞插件等。
本方案原理比较简单:扫描当前页面的View树,找到目标控件,模拟点击操作,下面详细阐述。
添加配置文件
首先需要在res
目录下建立配置文件:accessible_service_config.xml
,名字随意取。
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagReportViewIds"
android:canRetrieveWindowContent="true"
android:notificationTimeout="100"
android:description="@string/description"
android:packageNames="目标包名"/>
accessibilityEventTypes
:设置响应事件的类型,这里设置typeAllMask
,就是响应全部类型的事件。
accessibilityFeedbackType
:设置回馈给用户的方式,有语音播出和振动,这里使用通用类型。
notificationTimeout
:设置响应时间。
packageNames
:目标包名,比如红包插件就要设置微信包名,关于包名如何获取,下文会提到。
继承AccessibilityService编码
接着我们继承AccessibilityService
新建AutoClickAccessibilityService
,重写onAccessibilityEvent(AccessibilityEvent event)
。
public class AutoClickAccessibilityService extends AccessibilityService {
private static final String TAG = "GK";
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
ztLog("===start===");
try {
//拿到根节点
AccessibilityNodeInfo rootIn