文章目录

  • 前言
  • 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文档

获取输入焦点 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文档

API文档

AccessibilityService

AccessibilityService对象可以用来执行直接全局性的操作, 比如按手机home键, 按手机back键, 截屏键等.

执行操作的函数签名:

android.accessibilityservice.AccessibilityService#performGlobalAction

API文档

回退 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)
}