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

前言

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控件.

系列文章


联系作者

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

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值