美文网首页
无障碍(一)功能实现

无障碍(一)功能实现

作者: NIIIICO | 来源:发表于2022-07-22 11:06 被阅读0次

    一、简介

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

    二、使用

    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。

    属性 对象属性 功能
    accessibilityEventTypes public int eventTypes; 无障碍可以接收的事件,typeAllMask表示接收所有事件,多个值用 "|" 隔开
    accessibilityFeedbackType public int feedbackType; 多个值用 "|" 隔开
    accessibilityFlags public int flags; 多个值用 "|" 隔开
    canRetrieveWindowContent private int mCapabilities; 此服务是否可以读取窗口中的内容
    description private int mDescriptionResId; 描述此服务的信息,会显示在系统开启服务的设置界面
    notificationTimeout public long notificationTimeout; 发送2次事件的时间间隔,超过后事件作废
    packageNames public String[] packageNames; 被监听的应用的包名,多个用","分割
    settingsActivity private 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
    获取到的内容

    相关文章

      网友评论

          本文标题:无障碍(一)功能实现

          本文链接:https://www.haomeiwen.com/subject/mllmirtx.html