acc--›Android无障碍开发常用操作

2023-05-16

文章目录

  • 前言
  • 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)
}

更多请查看api文档

API文档

系列文章

  • acc–›Android无障碍开发入门
  • acc–›Android无障碍开发常用操作
  • acc–›Android无障碍开发手势操作
  • acc–›Android无障碍开发框架

联系作者

群内有各(pian)种(ni)各(jin)样(qun)的大佬,等你来撩.

点此QQ对话 该死的空格 点此快速加群

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

acc--›Android无障碍开发常用操作 的相关文章

  • 这个方法比 Math.random() 更快吗?

    我是一名初学者 目前已经开始开发一款使用粒子群优化算法的 Android 游戏 我现在正在尝试稍微优化我的代码 并且 for 循环中有相当多的 Math random 几乎一直在运行 所以我正在考虑一种方法来绕过并跳过所有 Math ran
  • 适用于 IOS 和 Android 的支付网关 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在开发一个应用程序 用户必须在澳大利亚餐馆通过应用程序 android ios 付款 有两种付款方式 通过 PayPal 或 Visa
  • 如何从该 JAVA 文件中提取 Delphi 类以与 Android 一起使用?

    我的Delphi XE7项目需要与FTDI FT311 Android 配件芯片 http www ftdichip com Products ICs FT311D html 他们帮助提供了一个 Android 演示 其中包括他们的 JAV
  • 我在哪里可以获得可靠的熵来源(真正的随机性字节[])?

    目前 我正在寻找一种方法来增加随机性的质量 in my Android应用程序 纸牌游戏 之前 估计对于我的情况 52 排列 至少需要 226 位熵 226 个随机位 我打算用这个byte 作为种子SecureRandom SecureRa
  • 如何在 ADB 连接期间禁用电池充电?

    问题描述 每次我在电脑和手机之间连接 USB 线时 电池都会自动充电 我想使用 ADB 协议 但我不想在 ADB 连接期间为电池充电 是否可以关闭此充电功能 当然 我该怎么做呢 环境 Android 操作系统 4 及更高版本的手机 我只需要
  • 使用一个 apk 安装两个应用程序

    我有 2 个应用程序 1 内容提供者 2 使用此 ContentProvider 的应用程序 我需要使用单个 apk 文件安装这 2 个应用程序 我想在 Eclipse 中同时推送这两个应用程序 如果我将另一个项目添加到一个应用程序的构建路
  • 从 arraylist 和 hashmap 中删除重复项

    我有一个数组列表 其中包含付款人的姓名 另一个数组列表包含每次付款的费用 例如 nameArray 尼古拉 劳尔 洛伦佐 劳尔 劳尔 洛伦佐 尼古拉 价格数组 24 12 22 18 5 8 1 我需要将每个人的费用相加 所以数组必须变成
  • 需要使用手机后退按钮返回 Web 视图的帮助

    这是我的代码 package com testappmobile import android app Activity import android os Bundle import android view KeyEvent impor
  • 导入已经创建的sqlite数据库(xamarin)

    我正在使用 Xamarin 想知道如何导入我已经创建的 sqlite 数据库 到目前为止 我已将其添加到资产文件夹中 但不知道下一步从哪里开始 string localPath Path Combine System Environment
  • 如何在 android 中启动“添加联系人”活动

    您能告诉我如何在 Android 中启动 添加联系人 活动吗 谢谢 API 级别 5 及以上解决方案 Add listener so your activity gets called back upon completion of act
  • 更改卡片高度即更改 Jetpack 中与 Material 3 组合的卡片颜色

    我正在使用 Card 可组合项 我希望它的颜色为白色 但是当我向它添加一些高度时 它的颜色会更改为更像主要容器颜色 我看过文档 其中有一种称为高程覆盖的东西 但找不到说明如何使用它的示例 这是我的代码 Card modifier Modif
  • Android:如何使用后台线程?

    我开发了一个应用程序 它从互联网获取内容并相应地在设备的屏幕上显示它 该程序运行得很好 就是有点慢 加载并显示内容大约需要 3 4 秒 我想将获取内容并将其显示在后台线程中的所有代码放在一起 当程序执行这些功能时 我想显示一个进度对话框 你
  • 具有自定义源集的 Android Gradle 风格 - gradle 文件应该是什么样子?

    我有一个旧的 eclipse 项目 我已经转移到 android studio 并设置为使用flavor 它似乎工作得很好 直到我开始尝试在我的风格之间使用不同的 java 文件 我的项目设置是这样的 ProjectRoot acitonb
  • 如何在 NumberPicker 中一次显示 3 个以上的值

    我正在创建一个数字选择器 如下图所示 但如果有可用空间 我想显示 3 个以上的值 该选择器有 20 个项目 并且有足够的空间来显示 3 个以上的值 这可以使用 NumberPicker 来完成吗 只需以编程方式设置numberPicker
  • 像 WhatsApp 一样发送图片

    我做了一个聊天应用程序 我想添加照片 文件共享我的应用程序中的概念与 WhatsApp 相同 我已经使用该应用程序制作了Xmpp Openfire目前我正在使用此功能进行照片共享 但它并不完全可靠 public void sendFile
  • 适用于 Android 的 Google 云端硬盘\文档 API

    我在几个小时内将 Dropbox 与我的应用程序集成 因为 SDK 描述清晰并且有很好的使用示例 Google Drive 似乎只有一个 一刀切 的 Gdata SDK 它非常重 有很多依赖项 它使我的应用程序的大小增加了三倍 而且不是很直
  • SDK >=26 仍需要 mipmap/ic_launcher.png?

    在 Android 中 有两种指定启动器图标 可以说是应用程序图标 的方法 老 方式 在 mipmap 文件夹中指定不同的 png 文件 通常命名为 ic launcher png 但可以通过以下方式设置名称android icon mip
  • 如何在Android中创建一个简洁的两栏输入表单?

    我想创建一个整洁的两列输入表单 如下所示 到目前为止我的 xml 布局代码
  • 使用 DataBindingComponent 的 Inflate 方法

    当 Glide 成功渲染图像后 我在更新文本视图时看到此错误 致命异常 java lang IllegalStateException 必需 CustomBinding 类中的 DataBindingComponent 为 null 绑定适
  • 如何正确编写AttributeSet的XML?

    我想创建一个面板适用于 Android 平台的其他小部件 http code google com p android misc widgets 在运行时 XmlPullParser parser getResources getXml R

随机推荐

  • 在树莓派中安装ROS系统(Kinetic)

    在树莓派中安装ROS系统 重新梳理了一下树莓派的安装流程 xff0c 现在我们来开始吧 打开官网教程 http wiki ros org kinetic step1 安装源 xff08 中国 xff09 sudo sh c 39 etc l
  • ROS学习笔记-roscd指令

    对ROS文件系统而言 xff0c ROS中的roscd命令实现利用包的名字直接切换到相应的文件目录下 xff0c 命令使用方法如下 xff1a span class hljs tag roscd span span class hljs a
  • configure it with blueman-service

    用下面这个命令把Linux目录的名字由中文改成英文了 export LANG span class hljs subst 61 span en US xdg span class hljs attribute user span span
  • 关于Ubuntu16.04升级系统后启动报错问题的修复

    关于Ubuntu16 04升级系统后启动报错问题的修复 Ubuntu16 04升级后启动报错为 Failed to start Load Kernel Modules 使用systemctl status systemd modules l
  • Ubuntu Mate 自动登录

    树莓派安装Ubuntu Mate 设置自动启动 需要修改文件 usr share lightdm lightdm conf d 60 lightdm gtk greeter conf sudo vim usr share lightdm l
  • 记一次GL error: Out of memory!的崩溃

    现象描述 xff1a 设备外接UVC摄像头 xff0c 使用uvccamera库去打开 xff0c 在进行打开 gt 关闭压测的过程中 xff0c 发现到了940多次进程就崩溃 xff0c 大致log如下 xff1a 2020 05 04
  • Java中接口(Interface)的定义和使用

    有关 Java 中接口的使用相信程序员们都知道 xff0c 但是你们知不知道接口到底有什么用呢 xff1f 毫无疑问 xff0c 接口的重要性远比想象中重要 接下来我们便一起来学习Java中接口使用 Java接口是什么 Java接口是一系列
  • Java中向下转型的意义

    什么是向上转型和向下转型 在Java继承体系中 xff0c 认为基类 xff08 父类 超类 xff09 在上层 xff0c 导出类 xff08 子类 继承类 派生类 xff09 在下层 xff0c 因此向上转型的意思就是把子类对象转成父类
  • Java中单例模式的使用

    什么是单例模式 单例模式 xff0c 也叫单子模式 xff0c 是一种常用的软件设计模式 在应用这个模式时 xff0c 单例对象的类必须保证只有一个实例存在 许多时候整个系统只需要拥有一个的全局对象 xff0c 这样有利于我们协调系统整体的
  • acc--›Android无障碍开发入门

    文章目录 前言创建无障碍程序1 配置无障碍信息属性的说明accessibilityEventTypesaccessibilityFeedbackTypeaccessibilityFlagscanControlMagnification 96
  • Android RecyclerView完全解析

    什么是RecyclerView xff1f RecyclerView 是谷歌 V7 包下新增的控件 用来替代 ListView 的使用 在 RecyclerView 标准化了 ViewHolder 类似于 ListView 中 conver
  • 程序员也是会浪漫的->打造浪漫的Android表白程序

    一年前 xff0c 看到过有个牛人用HTML5绘制了浪漫的爱心表白动画 xff0c 后来又在华超的这篇文章上看到大神用Android写出了相同的效果 xff0c 于是也动手写了一下 xff0c 并加了一些功能 xff0c 感谢大神的指引 写
  • Android登录注册功能封装

    我们都知道Android应用软件基本上都会用到登录注册功能 xff0c 那么对一个一个好的登录注册模块进行封装就势在必行了 这里给大家介绍一下我的第一个项目中所用到的登录注册功能的 xff0c 已经对其进行封装 xff0c 希望能对大家有帮
  • Kotlin 官方学习教程之扩展

    扩展 类似于 C 和 Gosu xff0c Kotlin 也提供了一种可以在不继承父类也不使用类似装饰器这样的设计模式的情况下对指定类进行扩展的功能 这是通过称为扩展名的特殊声明来实现的 Kotlin 支持函数扩展和属性扩展 函数扩展 要声
  • Kotlin 官方学习教程之密封类与泛型

    密封类 密封类用于表示受限类层次结构 xff0c 当值可以有一个有限集合的类型 xff0c 但不能有其他类型 它们在某种意义上是枚举类的扩展 xff1a 枚举类型的值集合也受到限制 xff0c 但每个枚举常量仅作为单个实例存在 xff0c
  • 致年轻时如此拼搏的你我

    离别总是伤人意 这一篇文章写在这个时候是有其特殊意义和价值 xff0c 起码对我来说是这样的 这个时候正是一年一度的毕业季 xff0c 而我最敬重的师兄即将要离校实习 xff0c 很幸运的是师兄收到了很不错的 offer xff0c 在这里
  • Linux网络编程:libnet 移植及使用

    目录 参考文章 xff1a 一 libnet库下载二 libnet库交叉编译安装三 应用程序交叉编译四 Ubuntu系统安装 libnet xff08 非交叉编译 xff09 五 libnet使用六 开发板上测试 参考文章 xff1a li
  • ZYNQ Linux 使用SPI驱动

    原文链接 xff1a ZYNQ Linux使用SPI驱动 配置 Vivado Vivado中双击ZYNQ PS核 xff08 例如ZYNQ7000 xff09 xff0c 选上需要使用的SPI xff0c 这一步略 spi该驱动不支持片选功
  • Call to undefined function think\captcha\imagettftext()

    php安装gd库以后 xff0c 在生成验证码图片的时候报错Call to undefined function think captcha imagettftext xff0c 查阅资料 xff08 参考资料 xff1a http www
  • acc--›Android无障碍开发常用操作

    文章目录 前言AccessibilityNodeInfo获取输入焦点 96 api gt 61 14 96 清理输入焦点 96 api gt 61 14 96 选中 96 api gt 61 14 96 清理选中 96 api gt 61