acc--›Android无障碍开发入门
文章目录
- 前言
- 创建无障碍程序
- 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无障碍开发入门相关推荐
- 5G 时代的 Android App 开发入门与项目实战
随着移动互联网的持续发展,Android系统从智能手机逐步拓展到平板电脑.智能电视.车载大屏.智能家居.智能手表等诸多设备,Android开发依然是前景可期的IT岗位. 当然,整个社会正在迈向5G时代 ...
- 《Android应用开发入门经典(第3版)》——第6.1节创建演示应用
本节书摘来自异步社区<Android应用开发入门经典(第3版)>一书中的第6章,第6.1节创建演示应用,作者 [美]Carmen Delessio , Lauren Darcey , Sh ...
- 《Android应用开发入门经典(第3版)》——导读
本节书摘来自异步社区<Android应用开发入门经典(第3版)>一书中的目录,作者 [美]Carmen Delessio , Lauren Darcey , Shane Conder,更多 ...
- Android 游戏开发入门
Android 游戏开发入门 图书描述: Android系统已经红遍了大江南北,持有Android设备的人也在不断增长.看着大街上用手指划着手机玩游戏的人,你有没有一种自己做一个游戏的想法呢?然而,入 ...
- Android JNI开发入门之二
在上一篇文章<Android JNI开发入门之一>中,我介绍了Android应用程序(APK)怎样通过JNI调用Native C实现的共享库.本文将进一步介绍Android应用程序通过JN ...
- android开发入门与实践_我的新书《Android App开发入门与实战》已经出版
前言 工作之余喜欢在CSDN平台上写一些技术文章,算下时间也有两三年了.写文章的目的一方面是自己对技术的总结,另一方面也是将平时遇到的问题和解决方案与大家分享,还有就是在这个平台上能和大家共同交流. ...
- Android SELinux开发入门指南之如何增加Native Binder Service权限
Android SELinux开发入门指南之如何增加Native Binder Service权限 Android SELinux开发多场景实战指南目录: Android SELinux开发入门指 ...
- Android SELinux开发入门指南之正确姿势解决访问data目录权限问题
Android SELinux开发入门指南之正确姿势解决访问data目录权限问题 Android SELinux开发多场景实战指南目录: Android SELinux开发入门指南之SELinux ...
- Android SELinux开发入门指南之如何增加Java Binder Service权限
Android SELinux开发入门指南之如何增加Java Binder Service权限 Android SELinux开发多场景实战指南目录: Android SELinux开发入门指南之 ...
最新文章
- @RestController和@Controller区别
- C# 正则表达式验证
- 备战秋招 |《百面机器学习》算法+leetcode开班报名!
- wxWidgets:wxPlatformInfo类用法
- C语言使用Linked List实现statk(附完整源码)
- Codeforces Round #701 (Div. 2) D. Multiples and Power Differences 思维构造
- PCB genesis自制孔点 Font字体实现方法
- 在你们看来,信息网络的定级如何才能更好的发展?或者说有什么影响因素使得定级工作不好开展?
- wamp的卸载、安装与配置apache配置伪静态
- java调用linux命令
- c语言告白,C语言告白代码,一闪一闪亮晶晶~
- Spring Boot内嵌Tomcat原理
- mate30pro鸿蒙系统刷机包下载,华为 Mate 30 Pro 的鸿蒙 2.0 Beta 版刷机包流出(附下载地址)...
- oa处理会签流程图_OA-审批流程管理模块
- 转]自己开心一下!!!很轻松的~
- CnOpenData中国高新技术企业专利统计数据
- 监控Linux磁盘情况,进行邮件告警
- resetFields方法重置表单
- SEO新手怎么做好网站关键词优化?
- 【渝粤教育】电大中专微生物与寄生虫基础 (2)_1作业 题库
热门文章
- ns木偶机器人的_为有4个友好木偶的孩子提供开源教育
- 自考女生经历:我终于走进了IBM
- Linux目录结构及详细介绍
- Linux并口设备驱动程序设置
- win7计算机双击空白,Win7系统电脑Windows功能无法显示怎么办|Windows功能显示空白的两种解决方法...
- java pdf png_java pdf转换为png图片
- CVE-2021-21315 Linux sudoNode.js命令注入
- mysql给一个表添加外键约束_Mysql添加外键约束
- VS2008过期------操作系统Win7,VS2008正版序列号
- 钥道不止,目录在线:瞎找不如阅目录