文章目录
- 前言
- AccessibilityNodeInfo
- 获取输入焦点 `api>=14`
- 清理输入焦点 `api>=14`
- 选中 `api>=14`
- 清理选中 `api>=14`
- 点击 `api>=16`
- 长按 `api>=16`
- 获取无障碍焦点 `api>=16`
- 清理无障碍焦点 `api>=16`
- 向前滚动 `api>=16`
- 向后滚动 `api>=16`
- 复制选中内容 `api>=18`
- 粘贴剪切板内容 `api>=18`
- 剪切剪切板内容 `api>=18`
- 设置节点文本 `api>=21`
- 更多请查看api文档
- AccessibilityService
- 回退 `api>=16`
- 首页 `api>=16`
- 打开最近使用程序 `api>=16`
- 打开通知栏 `api>=16`
- 打开通知栏快速设置 `api>=17`
- 打开电源常见对话框 `api>=21`
- 打开分屏 `api>=24`
- 锁屏 `api>=28`
- 截屏 `api>=28`
- 常用操作
- 判断节点是否激活 `api>=14`
- 判断节点是否可以点击 `api>=14`
- 判断节点是否可以长按 `api>=14`
- 判断节点是否可以滚动 `api>=14`
- 判断节点是否选中 `api>=14`
- 判断节点是否是密码输入框 `api>=14`
- 判断节点是否可以复选 `api>=14`
- 判断复选状态 `api>=14`
- 判断节点是否可以获取焦点 `api>=14`
- 判断焦点状态 `api>=14`
- 判断节点是否对用户可见 `api>=16`
- 获取节点的文本信息
- getText `api>=14`
- getContentDescription `api>=14`
- getHintText `api>=26`
- getPaneTitle `api>=28`
- getTooltipText `api>=28`
- 获取节点控件的id `api>=18`
- 获取节点在屏幕中的位置 `api>=14`
- 获取节点的类型/类名 `api>=14`
- 枚举节点
- 更多请查看api文档
- 系列文章
- 联系作者
前言
无障碍
开发中,有个很重要的对象AccessibilityNodeInfo
,之后的操作90%都是通过这个对象完成的.
获取AccessibilityNodeInfo
对象有2中方式:
- 被动通过
onAccessibilityEvent
回调获取:
通过
onAccessibilityEvent
回调,获取到AccessibilityEvent
对象,再通过AccessibilityEvent.getSource()
方法获取AccessibilityNodeInfo
对象.
- 主动通过
AccessibilityService
对象获取:
直接通过
AccessibilityService#getRootInActiveWindow
方法获取AccessibilityNodeInfo
或者通过AccessibilityService#getWindows
获取到AccessibilityWindowInfo
对象, 再通过AccessibilityWindowInfo#getRoot
获取AccessibilityNodeInfo
对象.注意
大部分操作
均支持在子线程
中执行.
AccessibilityNodeInfo
AccessibilityNodeInfo
对象用来操作控件,比如点击某个控件
输入控件的文本
等.
执行操作的函数签名:
android.view.accessibility.AccessibilityNodeInfo#performAction(int)
获取输入焦点 api>=14
performAction(AccessibilityNodeInfo.ACTION_FOCUS)
清理输入焦点 api>=14
performAction(AccessibilityNodeInfo.ACTION_CLEAR_FOCUS)
选中 api>=14
performAction(AccessibilityNodeInfo.ACTION_SELECT)
清理选中 api>=14
performAction(AccessibilityNodeInfo.ACTION_CLEAR_SELECTION)
点击 api>=16
performAction(AccessibilityNodeInfo.ACTION_CLICK)
长按 api>=16
performAction(AccessibilityNodeInfo.ACTION_LONG_CLICK)
获取无障碍焦点 api>=16
performAction(AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS)
清理无障碍焦点 api>=16
performAction(AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS)
向前滚动 api>=16
无法滚动时, 会返回失败.
performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD)
向后滚动 api>=16
无法滚动时, 会返回失败.
performAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD)
复制选中内容 api>=18
performAction(AccessibilityNodeInfo.ACTION_COPY)
粘贴剪切板内容 api>=18
performAction(AccessibilityNodeInfo.ACTION_PASTE)
剪切剪切板内容 api>=18
performAction(AccessibilityNodeInfo.ACTION_CUT)
设置节点文本 api>=21
Bundle arguments = new Bundle();
arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE,"android");
performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments)
更多请查看api文档
AccessibilityService
AccessibilityService
对象可以用来执行直接全局性的操作, 比如按手机home
键, 按手机back
键, 截屏键
等.
执行操作的函数签名:
android.accessibilityservice.AccessibilityService#performGlobalAction
回退 api>=16
performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK)
首页 api>=16
performGlobalAction(AccessibilityService.GLOBAL_ACTION_HOME)
打开最近使用程序 api>=16
performGlobalAction(AccessibilityService.GLOBAL_ACTION_RECENTS)
打开通知栏 api>=16
performGlobalAction(AccessibilityService.GLOBAL_ACTION_NOTIFICATIONS)
打开通知栏快速设置 api>=17
performGlobalAction(AccessibilityService.GLOBAL_ACTION_QUICK_SETTINGS)
打开电源常见对话框 api>=21
performGlobalAction(AccessibilityService.GLOBAL_ACTION_POWER_DIALOG)
打开分屏 api>=24
performGlobalAction(AccessibilityService.GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN)
锁屏 api>=28
performGlobalAction(AccessibilityService.GLOBAL_ACTION_LOCK_SCREEN)
截屏 api>=28
performGlobalAction(AccessibilityService.GLOBAL_ACTION_TAKE_SCREENSHOT)
常用操作
判断节点是否激活 api>=14
android.view.accessibility.AccessibilityNodeInfo#isEnabled
判断节点是否可以点击 api>=14
android.view.accessibility.AccessibilityNodeInfo#isClickable
判断节点是否可以长按 api>=14
android.view.accessibility.AccessibilityNodeInfo#isLongClickable
判断节点是否可以滚动 api>=14
android.view.accessibility.AccessibilityNodeInfo#isScrollable
判断节点是否选中 api>=14
android.view.accessibility.AccessibilityNodeInfo#isSelected
判断节点是否是密码输入框 api>=14
android.view.accessibility.AccessibilityNodeInfo#isPassword
判断节点是否可以复选 api>=14
android.view.accessibility.AccessibilityNodeInfo#isCheckable
判断复选状态 api>=14
android.view.accessibility.AccessibilityNodeInfo#isChecked
判断节点是否可以获取焦点 api>=14
android.view.accessibility.AccessibilityNodeInfo#isFocusable
判断焦点状态 api>=14
android.view.accessibility.AccessibilityNodeInfo#isFocused
判断节点是否对用户可见 api>=16
android.view.accessibility.AccessibilityNodeInfo#isVisibleToUser
获取节点的文本信息
getText api>=14
节点的文本
androidx.core.view.accessibility.AccessibilityNodeInfoCompat#getText
getContentDescription api>=14
节点的内容描述
androidx.core.view.accessibility.AccessibilityNodeInfoCompat#getContentDescription
getHintText api>=26
节点的提示文本
androidx.core.view.accessibility.AccessibilityNodeInfoCompat#getHintText
getPaneTitle api>=28
节点窗格的标题
androidx.core.view.accessibility.AccessibilityNodeInfoCompat#getPaneTitle
getTooltipText api>=28
节点的工具提示文本
androidx.core.view.accessibility.AccessibilityNodeInfoCompat#getTooltipText
获取节点控件的id api>=18
获取到的值大概是这样的:com.ss.android.ugc.aweme:id/afy
androidx.core.view.accessibility.AccessibilityNodeInfoCompat#getViewIdResourceName
获取节点在屏幕中的位置 api>=14
android.view.accessibility.AccessibilityNodeInfo#getBoundsInScreen(android.graphics.Rect)
获取节点的类型/类名 api>=14
值:android.widget.LinearLayout
androidx.core.view.accessibility.AccessibilityNodeInfoCompat#getClassName
枚举节点
遍历所有节点, 找到目标AccessibilityNodeInfo
节点, 从而进行相应的操作.
val node: AccessibilityNodeInfo
for (i in 0 until node.childCount) {
val child = node.getChild(i)
}