文章目录
- 前言
- AccessibilityNodeInfo
- AccessibilityService
- 常用操作
- 系列文章
- 联系作者
前言
无障碍
开发中,有个很重要的对象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)
}
更多请查看api文档
系列文章
联系作者
群内有各(pian)种(ni)各(jin)样(qun)
的大佬,等你来撩.