注意需要加上BIND_ACCESSIBILITY_SERVICE权限。代码片段2中的meta部分是AccessibilityService的配置信息,这是android 4.0后才支持的,代码如下:
// 代码片段3
<?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:packageNames=“com.tencent.mm”/>
设置配置信息还有第二种方法,就是在onServiceConnected()方法中使用代码设置,如代码片段1中的注释部分所示。这里的配置有很多属性,我们只研究其中的6个:
- android:packageNames:指定辅助服务监听哪些应用发出事件,多个应用包名之间用逗号分隔,如果不填,则监听手机上所有应用。例如我们现在要利用辅助点击做app的自动安装功能,取值com.android.packageinstaller。如果只关注微信发出的事件,那么取值com.tencent.mm。
- android:accessibilityEventTypes:辅助服务监听的事件类型,例如TYPE_VIEW_FOCUSED、TYPE_VIEW_CLICKED 、TYPE_WINDOW_STATE_CHANGED、TYPE_NOTIFICATION_STATE_CHANGED等等,如果监听全部事件,就取值typeAllMask
- android:accessibilityFlags:辅助服务额外的flag信息,例如FLAG_REPORT_VIEW_IDS可以使回调的事件带上view的ID。
- android:accessibilityFeedbackType:事件的反馈类型,例如通用反馈FEEDBACK_GENERIC、声音反馈FEEDBACK_AUDIBLE、语音反馈FEEDBACK_SPOKEN等。
- android:notificationTimeout:两个同样类型的监听事件发给辅助类的最小时间间隔
- android:canRetrieveWindowContent:是否可以获取窗口内容,一般设置为true
处理监听到的事件
前面就是使用辅助类的全部了,怎么样,是不是很简单?但是处理监听到的事件就有点麻烦了。我在github上写了一个微信抢红包的的开源项目,代码地址,我结合这个git库的代码解释下如何处理监听事件。
处理事件的入口是onAccessibilityEvent(event: AccessibilityEvent?)方法,我写了一个分发事件的类:DispatchEvent.kt
,里面的方法dispatchEvent(event: AccessibilityEvent?, rootInActiveWindow: AccessibilityNodeInfo?)
负责分发事件,代码如下:
// 代码片段4
fun dispatchEvent(event: AccessibilityEvent?, rootInActiveWindow: AccessibilityNodeInfo?) {
val pkgName = event?.packageName.toString()
val eventType = event?.getEventType()
Log.i(TAG, “pkgName: p k g N a m e e v e n t T y p e : {pkgName} eventType: pkgNamee