acc--›Android无障碍开发入门

2023-05-16

文章目录

  • 前言
  • 创建无障碍程序
    • 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`
      • onServiceConnected
      • onAccessibilityEvent
      • onInterrupt
  • 总结
  • 系列文章
  • 联系作者

前言

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
flagRequestEnhancedWebAccessibility需要增强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控件.

系列文章

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

联系作者

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

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

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

acc--›Android无障碍开发入门 的相关文章

  • 使用新语法应用 Android Gradle 插件

    如何使用新的 Gradle 插件语法应用 Android 插件 plugins id version 代替 buildscript dependencies classpath com android tools build gradle
  • 将项目升级到Android Studio 1.0(Gradle问题)

    首先 我对 android 开发 android studio gradle 非常陌生 所以如果我问了一个愚蠢的问题 请原谅我 我的团队一直在使用 android studio 的 beta 版本开发一个项目 我刚刚安装了新版本 1 0 并
  • 需要使用手机后退按钮返回 Web 视图的帮助

    这是我的代码 package com testappmobile import android app Activity import android os Bundle import android view KeyEvent impor
  • 如何在 android 中启动“添加联系人”活动

    您能告诉我如何在 Android 中启动 添加联系人 活动吗 谢谢 API 级别 5 及以上解决方案 Add listener so your activity gets called back upon completion of act
  • 如何在 Android TextView 中使用土耳其语字符,如“ş ç ı ö”?

    我想在 android TextView 中写入 ile 但它没有正确绘制 怎样才能使用这样的字符呢 例如 我将文本视图设置为 ile 它显示为 ile 我怎样才能解决这个问题 尝试以下方法 看看是否有帮助 source http grou
  • 如何访问android库项目中的资源

    我正在构建一个 android 库项目 它内部需要一些静态资源 图像 xml 等 然后我想知道我可以把这些资源放在哪里以及如何访问它们 既然我把资源放到了assets文件夹 我使用 AssetManager 来访问资源 public cla
  • android中根据屏幕尺寸计算图像尺寸

    我正在尝试根据屏幕尺寸计算图像高度和宽度 我从后端获取 5 x 7 尺寸的图像 为了将像素乘以 72 进行转换 我有 360 X 504 尺寸的图像 对于 360 X 504 我的动态透明矩形区域将显示为 1 223 x 1 179 即 8
  • Android中如何检测WIFI连接何时建立?

    我需要检测何时通过 WIFI 建立网络连接 发送什么广播来确定已建立有效的网络连接 我需要验证是否存在有效的 HTTP 网络连接 我应该监听什么以及需要进行哪些额外测试才能知道是否存在有效连接 您可以注册一个BroadcastReceive
  • Android Fragment onCreateView 与手势

    我正在尝试在片段中使用手势 我在 FragmentActivity 中有以下内容来处理我的详细信息片段 我试图发生的情况是 当在视图上检测到滑动时 将该视图内的数据替换为上一个或下一个条目 如果有更好的方法来处理这个问题 我完全同意 然而
  • 如何在 NumberPicker 中一次显示 3 个以上的值

    我正在创建一个数字选择器 如下图所示 但如果有可用空间 我想显示 3 个以上的值 该选择器有 20 个项目 并且有足够的空间来显示 3 个以上的值 这可以使用 NumberPicker 来完成吗 只需以编程方式设置numberPicker
  • 具有代理设置的 Android 模拟器 - 致命错误:.//android/base/sockets/ 检查失败:isValidFd(fd)。 FD 1404 最大1024

    需要使用代理设置运行模拟器 我在命令提示符中使用以下命令来启动模拟器 emulator avd AVD for 3 7 WVGA Nexus One http proxy http username password IP Port 如果没
  • 有多少种方法可以将位图转换为字符串,反之亦然?

    在我的应用程序中 我想以字符串的形式将位图图像发送到服务器 我想知道有多少种方法可以将位图转换为字符串 现在我使用 Base64 格式进行编码和解码 它需要更多的内存 是否有其他可能性以不同的方式做同样的事情 从而消耗更少的内存 现在我正在
  • 屏幕开/关检测

    在这里 我试图确定屏幕是否打开 但按下电源锁定 解锁按钮时它似乎不起作用 应用程序运行没有错误 但 if else 中的代码似乎没有效果 Edited现在代码可以工作了 谢谢Olgun 但媒体播放器播放不会停止 并且每次在屏幕上 离屏时都会
  • 是否可以使用 CardView 为浮动操作按钮制作阴影?

    I know CardView不是为此而设计的 但理论上如果cardCornerRadius view size 2它应该导致圆圈 我错过了什么吗 绘制真实的动画阴影并不困难 您可以尝试在 Froyo 等任何 Android 设备上实现 L
  • 如何在 Android 上将动态 alpha 遮罩应用于文本

    I want to make a dynamic alpha mask with drawable shapes as circles or whatever and apply it to a drawed text on Android
  • Android Root 执行 su 带参数

    我在使用参数执行 su 时遇到问题 包含空格 我的 Command java 看起来像这样 public class Command Process process public String executeCommand String c
  • 在 Android 手机中通过耳机插孔发送数据

    我目前正在处理一个新项目 我必须通过具有特定电压的耳机插孔发送数据 然后我可以在该电压上工作 所以这里我需要根据我的数据来编程具体电压 我是否可以在android中访问耳机的输出电压 然后创建一个应用程序来控制该电压 这是一篇讨论此问题的
  • Flash 对象未显示在phonegap android 中

    我已经在 android 手机间隙创建了一个应用程序 我有一个屏幕 我想显示一个静态 flash obj 所以我在屏幕 HTML 页面中放入了以下代码
  • Fragment 生命周期和在不存在的 Fragment 上调用 onCreate 的问题

    我正在 Android 中测试片段 并且片段生命周期有一些令人困惑的行为 我有一个活动 在横向和纵向模式下使用 xml 布局 我有一些代码可以访问在片段布局之一中定义的 EditText 对象 如果我以横向模式启动应用程序 一切都会正常 我
  • 将焦距(以毫米为单位)转换为像素 - Android

    在 Android 中 我当前正在访问camera s焦距通过使用getFocalLength in Camera1 Camera2不是一个选择 我正在尝试完全填充当前的计算 focal length pix focal length m

随机推荐

  • Java日志框架-slf4j

    什么是slf4j xff1f slf4j xff08 simple logging facecade for java xff09 充当各种日志框架 xff08 例如java util logging logback log4j xff09
  • 用application/vnd.ms-excel 导出数据时数据格式不正确

    给这一列 设置样式 12346545645687874 style 61 mso number format 64 将数据格式设置成文本格式 疑问 xff1a 1 xff09 文本 xff1a vnd ms excel numberform
  • Android Framework-Android进程/线程和程序内存优化

    Android进程和线程 进程 xff08 Process xff09 是程序的一个运行实例 xff0c 以区别于 程序 这一静态的概念 xff1b 而线程 xff08 Thread xff09 则是CPU调度的基本单位 Android中的
  • windows发布qt程序依赖库qtwindows qtcore qtwidgets等的终极解决方案

    先给出答案 xff1a 利用windeployqt exe解决 xff0c windeployqt exe的位置在qt的vs插件的bin目录下 原因 xff1a 采用qt开发windows桌面程序 xff0c 由于qt已经安装在了系统路径下
  • Android Activity onNewIntent() 详解

    阅读更多 阅读难度 xff1a 中 阅读前提 xff1a 1 需要了解 Android 的生命周期 xff0c 每个方法的触发时机以及作用 2 需要了解 Activity 的 launchMode 模式和作用 3 Intent 基本知识及作
  • Tomcat 8.0 Mac 安装与配置

    工具 原料 1 xff0c JDK xff1a 版本为jdk 8u40 macosx x64 dmg 下载地址http www oracle com technetwork java javase downloads jdk8 downlo
  • 个人安卓学习笔记---java.io.IOException: Unable to open sync connection!

    在使用手机调试程序的时候出现了java io IOException Unable to open sync connection 这样的异常 xff0c 我尝试使用拔掉USB然后重新 xff0c 插入 xff0c 结果失败 再尝试 xff
  • "_OBJC_CLASS_$_Play", referenced from:

    IOS做了这么久也没写过什么博客 xff0c 不好不好 xff0c 今天开始写 遇到的问题 xff1a 34 OBJC CLASS Play 34 referenced from 解决方案 xff1a Tagert Build Phases
  • Blog--›Mac TNT 软件下载地址

    使用mac OS时 经常性的需要寻找tnt软件 你懂得 下载安装 由于国内网络的限制 百度搜索引擎的结果 基本都是国内搬运者的搬运结果 有些还需要vip才能下载 文章目录 原网址常用软件下载地址整理 2020 11 16 Adobe Pho
  • 树莓派SSH远程连接连接失败的解决办法

    树莓派SSH远程连接 将全新的树莓派系统烧录 xff0c 开机然后用SSH远程连接 xff0c 结果SSH连接提示 connection refused xff0c 导致连接树莓派失败 出现错误的原因是自 2016 11 25 官方发布的新
  • 在树莓派中安装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