无障碍(一)功能实现

一、简介

无障碍服务: 是一种应用,它可以模拟用户操作。协助残障用户或无法与设备进行全面互动的用户完成操作。例如,正在开车、照顾孩子或参加喧闹聚会的用户可能需要其他或替代的界面反馈方式。
无障碍通常被用在: 抢红包、一键获取权限、自动抢单等功能中。
详情可以了解官网介绍

二、使用

1、创建自己的Service继承自AccessibilityService

onAccessibilityEvent:触发了需要监听的无障碍事件后回调
onInterrupt:无障碍服务断开后回调

public class MyAccessibilityService extends AccessibilityService {

    @Override
    public void onCreate() {
        super.onCreate();
        Log.v("AAAAA", "MyAccessibilityService onCreate 无障碍服务已启动");
    }

    // 当触发了需要监听的无障碍事件后回调
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        // String pkgName = event.getPackageName().toString();
        int eventType = event.getEventType();
        AccessibilityNodeInfo nodeInfo = event.getSource();
        switch (eventType) {
            case AccessibilityEvent.TYPE_VIEW_CLICKED:
                break;
            case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:
                setttleNodeInfo(nodeInfo);
                break;
            case AccessibilityEvent.TYPE_VIEW_FOCUSED:
                break;
        }
        nodeInfo.recycle();
    }

    // 打印所有控件的getText
    private void setttleNodeInfo(AccessibilityNodeInfo nodeInfo) {
        if (nodeInfo == null) return;
        for (int i = 0; i < nodeInfo.getChildCount(); i++) {
            AccessibilityNodeInfo child = nodeInfo.getChild(i);
            Log.v("AAAAA", "setttleNodeInfo getClassName:" + child.getClassName() + ", getText:" + child.getText());
            if (child.getChildCount() != 0) {
                setttleNodeInfo(child);
            }
        }
    }

    // 无障碍服务断开后回调
    @Override
    public void onInterrupt() {
    }
}
2、在AndroidManifest.xml文件中配置Service

(1)为了被视为无障碍服务,需要在清单的application元素中添加一个service。
(2)在service中,还需要添加一个无障碍服务intent过滤器。
(3)为了与Android 4.1以上版本兼容,还需要添加android.accessibilityservice.AccessibilityService权限以确保只有系统可以绑定到它。
(4)Android 4.0开始,可以在清单中添加一个引用配置文件的< meta-data>元素,对无障碍服务进行配置。

<!-- 注册辅助功能服务-->
<!-- label:无障碍服务的名称-->
<service
    android:name=".MyAccessibilityService"
    android:exported="true"
    android:label="我的测试"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>
    <!--通过xml文件完成辅助功能相关配置,也可以在onServiceConnected中动态配置-->
    <meta-data
        android:name="android.accessibilityservice"
        android:resource="@xml/access_config" />
</service>
3、创建配置文件xml/accessibility_config.xml

在res目录下新建xml文件夹,并在xml中新建accessibility_config.xml配置文件。

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackAllMask"
    android:accessibilityFlags="flagDefault"
    android:canRetrieveWindowContent="true"
    android:description="@string/app_accessibility_description"
    android:notificationTimeout="100"
    android:packageNames="com.niiiico.demo" />

上述配置的属性,可以在AccessibilityServiceInfo对象中看到,在对象属性中有相关注释标识取值范围,详情可直接查看AccessibilityServiceInfo。

属性对象属性功能
accessibilityEventTypespublic int eventTypes;无障碍可以接收的事件,typeAllMask表示接收所有事件,多个值用 “|” 隔开
accessibilityFeedbackTypepublic int feedbackType;多个值用 “|” 隔开
accessibilityFlagspublic int flags;多个值用 “|” 隔开
canRetrieveWindowContentprivate int mCapabilities;此服务是否可以读取窗口中的内容
descriptionprivate int mDescriptionResId;描述此服务的信息,会显示在系统开启服务的设置界面
notificationTimeoutpublic long notificationTimeout;发送2次事件的时间间隔,超过后事件作废
packageNamespublic String[] packageNames;被监听的应用的包名,多个用","分割
settingsActivityprivate String mSettingsActivityName;系统启动服务界面会出现一个设置按钮,用来打开这个Activity
4、启动检查和跳转设置

(1)启动检查

public boolean isAccessibilityEnabled() {
    String localServiceStr = new ComponentName(getPackageName(), MyAccessibilityService.class.getName()).flattenToShortString();
    AccessibilityManager accessibilityManager = (AccessibilityManager) getSystemService(Context.ACCESSIBILITY_SERVICE);
    List<AccessibilityServiceInfo> accessibilityservices = accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_GENERIC);
    for (AccessibilityServiceInfo info : accessibilityservices) {
        if (localServiceStr.equals(info.getId())) {
            return true;
        }
    }
    return false;
}

(2)跳转设置

public void gotoSetting() {
    Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
}

三、测试

无障碍服务不需要手动启动,通过跳转到系统开启无障碍界面,系统设置界面打开后,无障碍服务就会被启动。

无障碍列表.jpg无障碍详情.jpg

获取到的内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值