一、什么是无障碍服务?
无障碍服务是指能够帮助残障用户或者不方便与设备进行交互的用户完成人机交互的辅助功能App,App内部通过调用无障碍相关Api实现监听和模拟用户操作。例如Google为视觉障碍用户提供的标准服务talkback,或者语音交互、又或者国内比较知名的李跳跳。无障碍服务不仅只针对残障用户,普通用户在很多场景也是可以享受到它带来的便利。无障碍服务具有监听界面和替代用户操作的能力,Google建议仅用于帮助残障用户能够更好地使用Android设备,但其能力远不止于此。
二、如何使用
2.1 创建无障碍服务
class HelpService : AccessibilityService() {
override fun onAccessibilityEvent(event: AccessibilityEvent?) {
//该服务的核心方法,其中参数event封装来自界面相关事件的信息,比如我们可以获得该事件的事件类型,进而根据起类型选择不同的处理方式
}
override fun onInterrupt() {
//系统需要中断AccessibilityService反馈时,将调用此方法。AccessibilityService反馈包括服务发起的震动、音频等行为
}
override fun onServiceConnected() {
super.onServiceConnected()
//当系统绑定此服务后触发,可以在此做一些初始化操作,此方法根据需要选择是否实现
}
override fun onUnbind(intent: Intent?): Boolean {
//系统关闭该服务时调用,一般是系统资源不足用于释放资源
return super.onUnbind(intent)
}
}
2.2 清单申明
<service
android:name=".service.HelpService"
android:label="无障碍服务名称"
android:exported="false"
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/a11y_service_config" />
</service>
注意一下几点:
-
android:label="无障碍服务名称"
申明服务名称,显示在无障碍列表中。 -
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
,权限固定值,保证系统能够绑定该服务。 - intent过滤器,固定值
<actionandroid:name="android.accessibilityservice.AccessibilityService" />
。 - 其生命周期由系统管理,并遵循service的基本生命周期,只能手动在设置中启动。
2.3 服务配置
在清单申明中使用了如下代码申明了服务的配置:
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/a11y_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="feedbackSpoken"
android:accessibilityFlags="flagDefault"
android:canRetrieveWindowContent="true"
android:description="无障碍服务描述"
android:notificationTimeout="100"
android:packageNames="需要监听的app包名"
android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity" />
参数说明:
- accessibilityEventTypes:表示该服务对界面中的哪些变化感兴趣,也就时说你想要关注哪些事件,比如窗口打开,滑动,焦点变化,长按等。具体的值可以在AccessibilityEvent类中查到,如typeAllMask表示接受所有的事件通知。
- accessibilityFeedbackType:表示反馈方式,比如是语音播放,还是震动
-
accessibilityFlags:其他标志,配置需要获取的信息,常量值,多个使用 '|' 连接。也可以通过调用
android.accessibilityservice.AccessibilityService.setServiceInfo(android.accessibilityservice.AccessibilityServiceInfo)
动态设置。 - canRetrieveWindowContent:表示该服务能否访问活动窗口中的内容。
- description:无障碍服务的描述内容,可以在开启辅助功能页面看到该服务。
- notificationTimeout:发送到此服务的相同类型事件的最小间隔时间。
- packageNames:需要辅助的应用包名,多包名使用 ',' 隔开,不写表示监听所有应用。
-
settingsActivity:可以更改此服务设置的界面(类名全称,包含包名),不懂动态设置。
以上参数除了settingsActivity
外,都可以通过AccessibilityServiceInfo配置。
2.4 启动无障碍服务
启动无障碍服务需要用户手动打开: