文章目录
- 前言
- 创建无障碍程序
- 1.配置无障碍信息
- 属性的说明
- accessibilityEventTypes
- accessibilityFeedbackType
- accessibilityFlags
- canControlMagnification `api>=24`
- canRequestEnhancedWebAccessibility `api>=18`
- canRequestFilterKeyEvents `api>=18`
- canRequestTouchExplorationMode `api>=18`
- canRetrieveWindowContent `api>=18`
- canTakeScreenshot `api>=30`
- canPerformGestures `api>=24`
- canRequestFingerprintGestures `api>=26`
- description
- interactiveUiTimeout
- nonInteractiveUiTimeout
- notificationTimeout
- packageNames
- settingsActivity
- summary
- 2.声明无障碍服务`AccessibilityService`
- 总结
- 系列文章
- 联系作者
前言
Android无障碍可以用来模拟人工的手动操作, 包括键盘输入
, 触屏输入
等
经典使用场景:自动化测试
自动抢红包
自动短视频点赞/评论/私信
等人工能完成的操作, 无障碍(acc)
99.99%都可以完成.
创建无障碍程序
1.配置无障碍信息
在src->main->res->xml
资源目录中, 创建xxx.xml
任意文件名的配置文件:
内容如下:
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackAllMask"
android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows|flagIncludeNotImportantViews|flagReportViewIds|flagEnableAccessibilityVolume|flagRequestAccessibilityButton|flagRequestEnhancedWebAccessibility|flagRequestFilterKeyEvents|flagRequestFilterKeyEvents|flagRequestShortcutWarningDialogSpokenFeedback"
android:canControlMagnification="true"
android:canPerformGestures="true"
android:canRequestEnhancedWebAccessibility="true"
android:canRequestFilterKeyEvents="true"
android:canRequestFingerprintGestures="true"
android:canRequestTouchExplorationMode="true"
android:canRetrieveWindowContent="true"
android:description="@string/lib_accessibility_description"
android:interactiveUiTimeout="2000"
android:nonInteractiveUiTimeout="2000"
android:notificationTimeout="100"
android:summary="@string/lib_accessibility_summary" />
并非所有字段都需要声明, 按需填写即可.
属性的说明
accessibilityEventTypes
无障碍服务需要监听的事件类型, 比如监听当界面内容有变化时
当点击事件触发时
等
属性值 | 说明 |
---|---|
typeAllMask | 监听所有无障碍的事件 api>=4 |
typeViewClicked | 监听view点击的事件 api>=4 |
typeViewFocused | 监听view获取到焦点的事件 api>=4 |
typeViewSelected | 监听view选中的事件 api>=4 |
typeViewTextChanged | 监听view内容改变的事件 api>=4 |
typeWindowContentChanged | 监听window内容改变的事件 api>=14 |
typeWindowStateChanged | 监听window状态改变的事件 api>=4 |
typeWindowsChanged | 监听window改变的事件 api>=21 |
… | 等等 |
多个属性值可以通过|
连接.
accessibilityFeedbackType
监听事件的反馈类型, 比如事件是通过说话反馈的
触摸反馈的
视觉反馈的
听觉反馈的
等
属性值 | 说明 |
---|---|
feedbackAllMask | 监听所有的反馈类型 api>=14 |
feedbackAudible | 监听由声音反馈的事件 api>=4 |
feedbackGeneric | 一般反馈的类型 api>=4 |
feedbackHaptic | 触摸反馈的类型 api>=4 |
feedbackSpoken | 说话反馈的类型 api>=4 |
feedbackVisual | 视觉反馈的类型 api>=4 |
accessibilityFlags
无障碍服务的特性请求标识,比如需要与窗口交互
需要得到视图的id
等
属性值 | 说明 |
---|---|
flagDefault | 默认特性 api>=4 |
flagEnableAccessibilityVolume | 无障碍服务需要控制音量 api>=26 |
flagIncludeNotImportantViews | 无障碍服务需要不重要的视图 api>=16 |
flagReportViewIds | 无障碍需要视图的id api>=18 |
flagRequestAccessibilityButton | 无障碍需要在导航栏中显示按钮 api>=26 |
需要增强web页面访问 api>=18 废弃api26 | |
flagRequestFilterKeyEvents | 需要键盘事件 api>=18 |
flagRequestFingerprintGestures | 需要指纹事件 api>=26 |
flagRequestMultiFingerGestures | 需要多指纹事件 api>=30 |
flagRequestShortcutWarningDialogSpokenFeedback | 需要读出对话框反馈 api>=29 |
flagRequestTouchExplorationMode | 需要触摸探测模式 api>=16 |
flagRetrieveInteractiveWindows | 需要与窗口交互, 获取窗口内容 api>=21 |
flagSendMotionEvents | |
flagServiceHandlesDoubleTap | 需要拦截双击手势处理 api>=30 |
canControlMagnification api>=24
此辅助功能服务可以控制显示放大倍数
canRequestEnhancedWebAccessibility api>=18
需要增强web页面访问
canRequestFilterKeyEvents api>=18
需要键盘事件
canRequestTouchExplorationMode api>=18
需要触摸探测模式
canRetrieveWindowContent api>=18
需要与窗口交互, 获取窗口内容
canTakeScreenshot api>=30
是否能够截屏
// api>=28
AccessibilityService#performGlobalAction(AccessibilityService.GLOBAL_ACTION_TAKE_SCREENSHOT)
// api>=30
AccessibilityService#takeScreenshot()
AccessibilityService#takeScreenshot
canPerformGestures api>=24
是否可以执行手势操作
CAPABILITY_CAN_PERFORM_GESTURES
canRequestFingerprintGestures api>=26
是否可以请求指纹传感器
description
无障碍的描述内容, 会出现在系统无障碍设置界面.
interactiveUiTimeout
控件交互时的超时时间, 毫秒
nonInteractiveUiTimeout
非控件交互时的超时时间, 毫秒
notificationTimeout
同一类型事件2次之间发送的最小周期, 毫秒
packageNames
指定需要接收事件的应用程序, 多个用,
分割. 不指定表示接收所有应用程序的事件.
settingsActivity
配置活动的设置界面, 可以不指定.
summary
无障碍的描述的概要, 在系统无障碍列表中展示.
2.声明无障碍服务AccessibilityService
自定义个服务类MyAccessibilityService
继承AccessibilityService
:
class MyAccessibilityService : AccessibilityService() {
/**当无障碍服务连接之后回调*/
override fun onServiceConnected() {
super.onServiceConnected()
}
/**当触发了需要监听的无障碍事件后回调*/
override fun onAccessibilityEvent(event: AccessibilityEvent?) {
}
/**w无障碍服务断开后回调*/
override fun onInterrupt() {
}
}
在清单文件AndroidManifest.xml
中声明服务:
<application>
<service
android:name="com.xxx.MyAccessibilityService"
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/lib_accessibility_service_config" />
</service>
</application>
onServiceConnected
当声明的无障碍服务连接之后, 系统会回调此方法.
在这个方法里, 可以做一些初始化工作. 比如保存服务的实例
标识服务连接的状态
等.
也可以通过android.accessibilityservice.AccessibilityService#getServiceInfo
动态更改xml配置
文件中声明的无障碍配置
信息.
onAccessibilityEvent
当监听的事件触发时, 系统会回调此方法, 比如view被点击了
window内容改变了
等.
可以用android.view.accessibility.AccessibilityRecord#getSource
获取对象AccessibilityNodeInfo
, 这个对象就是无障碍操作的核心对象, 通常可以理解为android
开发中的view
控件.
可以通过AccessibilityNodeInfo
对象, 进行控件的点击操作
输入文本操作
滚动操作
获取文本操作
等
onInterrupt
当中途关闭了无障碍服务时回调, 通常这个时候无障碍服务不可用, 调用api都会失败.
总结
到此, 一个简单的无障碍服务
应用程序就可以运行了.
在系统的无障碍服务设置列表
里面就可以看到对应声明的无障碍服务
了.
并且可以通过onAccessibilityEvent
回调中的AccessibilityEvent
对象, 拿到AccessibilityNodeInfo
对象, 进而操作界面上的view控件
.
系列文章
联系作者
群内有各(pian)种(ni)各(jin)样(qun)
的大佬,等你来撩.