Android AccessibilityService
简介
无障碍服务(AccessibilityService),是Google推出为了帮助残障用户使用 Android 设备和应用而推出的比较特殊的service。通过无障碍服务,开发者可提供界面增强功能,来协助残障用户或可能暂时无法与设备进行全面互动的用户完成操作。
无障碍服务虽然不位于Android四大组件之中,但功能给产品带来的影响却不可小觑,例如曾经的自动抢红包功能,甚至因为太过火爆,而被某些手机厂商加入到系统功能之中,那时抢红包靠的就不是手速。其它类似使用无障碍服务开发的产品有微光盲人生活辅助平台,讯飞心智无障碍助手软件等。
作用
无障碍服务,可以监听界面的操作,比如:点击、拖动、界面更新等信息。更为强大的是可以获取屏幕信息,同时具备普通Service的能力。(在别人手机中植入一个无障碍服务并开启,可以监听他的手机操作和屏幕信息,eg:获取微信、QQ当前聊天文字并上传)
因为无障碍服务相比一般Service过于强大,安装后还需要在设置->辅助功能中手动开启。
创建AccessibilityService与声明
https://developer.android.google.cn/reference/android/accessibilityservice/AccessibilityService.html
1.创建一个类继承自AccessibilityService
为了使一个service
被视为无障碍服务,必须在清单的application
标签中添加一个service
标签、过滤器,为了与 Android 4.1 及更高版本兼容,还必须添加BIND_ACCESSIBILITY_SERVICE
权限。
public class MyAccessibilityService extends AccessibilityService {
protected void onServiceConnected() {
super.onServiceConnected();
//无障碍服务连接 可以在这里打开一个悬浮窗等等
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
//事件处理
}
@Override
public void onInterrupt() {
//无障碍服务断开连接
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
}
AccessibilityService继承自普通的Service,因而具备普通Service的生存周期,同时具有自己的一些生命周期。
函数名 | 描述 |
---|---|
onServiceConnected() | (可选)当系统成功连接到该AccessibilityService时,将调用此方法。主要用与一次性配置或调整的代码。 |
onAccessibilityEvent() | (必要)当系统监测到相匹配的AccessibilityEvent事件时,将调用此方法,在整个Service的生命周期中,该方法将被多次调用。 |
onInterrupt() | (必要)系统需要中断AccessibilityService反馈时,将调用此方法。AccessibilityService反馈包括服务发起的震动、音频等行为。 |
onUnbind() | (可选)系统要关闭该服务是,将调用此方法。主要用来释放资源。 |
2.AccessibilityService服务声明
和普通Service一样,AccessibilityService同样需要在Manifest.xml中注册。
<service android:name=".MyAccessibilityService"
android:label="@string/accessibility_service_label"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data android:name="android.accessibilityservice"
android:resource="@xml/accessibility_service_config" />
</service>
android.permission.BIND_ACCESSIBILITY_SERVICE权限和action是必须的。
同时AccessibilityService需要提供设置列表(meta-data),该设置也可以在运行时通过AccessibilityService.setServiceInfo (AccessibilityServiceInfo info)进行动态设置。不过该方式并不能设置所有的参数,因而推荐的方法为(meta-data)。
android:resource中的地址为:/res/xml/accessibility_service_config.xml。
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/accessibility_service_description"
android:packageNames="com.example.android.apis"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFlags="flagDefault"
android:accessibilityFeedbackType="feedbackSpoken"
android:notificationTimeout="100"
android:canRetrieveWindowContent="true"
android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity"/>
<!--description:服务的描述文字-->
<!--canPerformGestures:是否支持手势-->
<!--notificationTimeout:事件的发送间隔事件,单位毫秒-->
<!--canRetrieveWindowContent:是否允许读取窗口中的内容-->
各项参数参考AccessibilityServiceInfo。
AccessibilityServiceInfo 配置类
https://developer.android.google.cn/reference/android/accessibilityservice/AccessibilityServiceInfo.html
AccessibilityService的配置类,可使用setService进行动态设置,同时和上述的accessibility_service_config.xml相对应。
以下参数可以使用“|”表示使用多个选项。
android:accessibilityEventTypes 事件类型
AccessibilityService服务响应的事件类型,只有声明了的类型,系统才会调用该服务的onAccessibilityEvent。
常量 | 描述 |
---|---|
typeViewClicked | 点击事件 |
typeViewSelected | view被选择 |
typeViewScrolled | 滑动事件 |
typeWindowContentChanged | 窗口内容该表 |
typeAllMask | 所有事件 |
完整列表如下:
typeViewClicked
typeViewLongClicked
typeViewSelected
typeViewFocused
typeViewTextChanged
typeWindowStateChanged
typeNotificationStateChanged
typeViewHoverEnter
typeViewHoverExit
typeTouchExplorationGestureStart
typeTouchExplorationGestureEnd
typeWindowContentChanged
typeViewScrolled
typeViewTextSelectionChanged
typeAnnouncement
typeViewAccessibilityFocused
typeViewAccessibilityFocusCleared
typeViewTextTraversedAtMovementGranularity
typeGestureDetectionStart
typeGestureDetectionEnd
typeTouchInteractionStart
typeTouchInteractionEnd
typeWindowsChanged
typeContextClicked
typeAssistReadingContext
typeAllMask
android:accessibilityFeedbackType 反馈类型
AccessibilityService服务的反馈类型。
常量 | 描述 |
---|---|
feedbackSpoken | 语音反馈 |
feedbackHaptic | 触觉(震动)反馈 |
feedbackAudible | 音频反馈 |
feedbackVisual | 视频反馈 |
feedbackGeneric | 通用反馈 |
feedbackAllMask | 以上都具有 |
android:accessibilityFlags 额外声明
一些格外的参数。
常量 | 描述 |
---|---|
flagDefault | 默认 |
flagIncludeNotImportantViews | |
flagRequestTouchExplorationMode | |
fla |