文章目录

  • 前言
  • 创建无障碍程序
    • 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><serviceandroid:name="com.xxx.MyAccessibilityService"android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"><intent-filter><action android:name="android.accessibilityservice.AccessibilityService" /></intent-filter><meta-dataandroid: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对话 该死的空格 点此快速加群

acc--›Android无障碍开发入门相关推荐

  1. 5G 时代的 Android App 开发入门与项目实战

    随着移动互联网的持续发展,Android系统从智能手机逐步拓展到平板电脑.智能电视.车载大屏.智能家居.智能手表等诸多设备,Android开发依然是前景可期的IT岗位. 当然,整个社会正在迈向5G时代 ...

  2. 《Android应用开发入门经典(第3版)》——第6.1节创建演示应用

    本节书摘来自异步社区<Android应用开发入门经典(第3版)>一书中的第6章,第6.1节创建演示应用,作者 [美]Carmen Delessio , Lauren Darcey , Sh ...

  3. 《Android应用开发入门经典(第3版)》——导读

    本节书摘来自异步社区<Android应用开发入门经典(第3版)>一书中的目录,作者 [美]Carmen Delessio , Lauren Darcey , Shane Conder,更多 ...

  4. Android 游戏开发入门

    Android 游戏开发入门 图书描述: Android系统已经红遍了大江南北,持有Android设备的人也在不断增长.看着大街上用手指划着手机玩游戏的人,你有没有一种自己做一个游戏的想法呢?然而,入 ...

  5. Android JNI开发入门之二

    在上一篇文章<Android JNI开发入门之一>中,我介绍了Android应用程序(APK)怎样通过JNI调用Native C实现的共享库.本文将进一步介绍Android应用程序通过JN ...

  6. android开发入门与实践_我的新书《Android App开发入门与实战》已经出版

    前言 工作之余喜欢在CSDN平台上写一些技术文章,算下时间也有两三年了.写文章的目的一方面是自己对技术的总结,另一方面也是将平时遇到的问题和解决方案与大家分享,还有就是在这个平台上能和大家共同交流. ...

  7. Android SELinux开发入门指南之如何增加Native Binder Service权限

      Android SELinux开发入门指南之如何增加Native Binder Service权限 Android SELinux开发多场景实战指南目录: Android SELinux开发入门指 ...

  8. Android SELinux开发入门指南之正确姿势解决访问data目录权限问题

      Android SELinux开发入门指南之正确姿势解决访问data目录权限问题 Android SELinux开发多场景实战指南目录: Android SELinux开发入门指南之SELinux ...

  9. Android SELinux开发入门指南之如何增加Java Binder Service权限

      Android SELinux开发入门指南之如何增加Java Binder Service权限 Android SELinux开发多场景实战指南目录: Android SELinux开发入门指南之 ...

最新文章

  1. @RestController和@Controller区别
  2. C# 正则表达式验证
  3. 备战秋招 |《百面机器学习》算法+leetcode开班报名!
  4. wxWidgets:wxPlatformInfo类用法
  5. C语言使用Linked List实现statk(附完整源码)
  6. Codeforces Round #701 (Div. 2) D. Multiples and Power Differences 思维构造
  7. PCB genesis自制孔点 Font字体实现方法
  8. 在你们看来,信息网络的定级如何才能更好的发展?或者说有什么影响因素使得定级工作不好开展?
  9. wamp的卸载、安装与配置apache配置伪静态
  10. java调用linux命令
  11. c语言告白,C语言告白代码,一闪一闪亮晶晶~
  12. Spring Boot内嵌Tomcat原理
  13. mate30pro鸿蒙系统刷机包下载,华为 Mate 30 Pro 的鸿蒙 2.0 Beta 版刷机包流出(附下载地址)...
  14. oa处理会签流程图_OA-审批流程管理模块
  15. 转]自己开心一下!!!很轻松的~
  16. CnOpenData中国高新技术企业专利统计数据
  17. 监控Linux磁盘情况,进行邮件告警
  18. resetFields方法重置表单
  19. SEO新手怎么做好网站关键词优化?
  20. 【渝粤教育】电大中专微生物与寄生虫基础 (2)_1作业 题库

热门文章

  1. ns木偶机器人的_为有4个友好木偶的孩子提供开源教育
  2. 自考女生经历:我终于走进了IBM
  3. Linux目录结构及详细介绍
  4. Linux并口设备驱动程序设置
  5. win7计算机双击空白,Win7系统电脑Windows功能无法显示怎么办|Windows功能显示空白的两种解决方法...
  6. java pdf png_java pdf转换为png图片
  7. CVE-2021-21315 Linux sudoNode.js命令注入
  8. mysql给一个表添加外键约束_Mysql添加外键约束
  9. VS2008过期------操作系统Win7,VS2008正版序列号
  10. 钥道不止,目录在线:瞎找不如阅目录