导航号,我的单页导航
文章目录

前言

AccessibilityService是Android提供的无障碍服务,用于增强用户界面以帮助残障人士,或者可能暂时无法与设备充分交互的人们。

今天就简单的记录一下AccessibilityService的使用。

正文

直入正题

注册AccessibilityService

AccessibilityService跟普通Service的使用差不多

第一步
public class BiuAccessibilityService extends AccessibilityService {

    private final String TAG = AccessibilityApp.TAG + getClass().getSimpleName();

    /**
     * 当启动服务的时候就会被调用,系统成功绑定该服务时被触发,也就是当你在设置中开启相应的服务,
     * 系统成功的绑定了该服务时会触发,通常我们可以在这里做一些初始化操作
     */
    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        Log.d(TAG, "onServiceConnected: ");

//        //方式一,新增需要监听的eventTypes,然后会在onAccessibilityEvent中回调。
//        AccessibilityServiceInfo accessibilityServiceInfo = new AccessibilityServiceInfo();
//        accessibilityServiceInfo.eventTypes = AccessibilityEvent.TYPE_WINDOWS_CHANGED
//                | AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
//                | AccessibilityEvent.TYPE_VIEW_CLICKED
//                | AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED
//                | AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
//        accessibilityServiceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_ALL_MASK;
//        accessibilityServiceInfo.notificationTimeout = 0;
//        accessibilityServiceInfo.flags = AccessibilityServiceInfo.DEFAULT;
//        setServiceInfo(accessibilityServiceInfo);
    }

    /**
     * 通过系统监听窗口变化的回调,sendAccessibiliyEvent()不断的发送AccessibilityEvent到此处
     *
     * @param event
     */
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        int eventType = event.getEventType();
        Log.d(TAG, "onAccessibilityEvent eventType : " + eventType);
        //需要处理的类型
        if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
            //TYPE_NOTIFICATION_STATE_CHANGED的改变并不会每次都有Notification的通知。(不好用)
        }
    }

    /**
     * 中断服务时的回调.
     */
    @Override
    public void onInterrupt() {
        Log.d(TAG, "onInterrupt: ");
    }

    /**
     * 查找拥有特定焦点类型的控件
     *
     * @param focus
     * @return
     */
    @Override
    public AccessibilityNodeInfo findFocus(int focus) {
        Log.d(TAG, "findFocus focus : " + focus);
        return super.findFocus(focus);
    }

    /**
     * 如果配置能够获取窗口内容,则会返回当前活动窗口的根结点
     *
     * @return
     */
    @Override
    public AccessibilityNodeInfo getRootInActiveWindow() {
        Log.d(TAG, "getRootInActiveWindow: ");
        return super.getRootInActiveWindow();
    }


    /**
     * 获取系统服务
     *
     * @param name
     * @return
     */
    @Override
    public Object getSystemService(@NonNull String name) {
        Log.d(TAG, "getSystemService name : " + name);
        return super.getSystemService(name);
    }

    /**
     * 如果允许服务监听按键操作,该方法是按键事件的回调,需要注意,这个过程发生了系统处理按键事件之前
     *
     * @param event
     * @return
     */
    @Override
    protected boolean onKeyEvent(KeyEvent event) {
        Log.d(TAG, "onKeyEvent event : " + event);
        return super.onKeyEvent(event);
    }
}
第二步

AndroidManifest.xml中配置。

<service
    android:name=".service.BiuAccessibilityService"
    android:exported="true"
    android:label="@string/app_name"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>
    <!-- 方式二:从 Android 4.0 开始可添加[meta-data]配置,引用文件的res/xml/accessibility_config.xml-->
    <!--  <meta-data   -->
    <!--    android:name="android.accessibilityservice"-->
    <!--    android:resource="@xml/accessibility_config" />-->
</service>
res/xml/accessibility_config.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="flagRequestFilterKeyEvents"
    android:canRequestFilterKeyEvents="true"
    android:canRetrieveWindowContent="true"
    android:notificationTimeout="100" />

设置监听类型

上面代码中注释中有[方式一]和[方式二],可以选择放开一个。

还可以通过限制包名监听指定的应用,比如我们监听[com.biumall.ui]和[com.biumall.demo]

比如方式一:

accessibilityServiceInfo.packageNames = new String[]{"com.biumall.ui","com.biumall.demo"};

比如方式二:

android:packageNames="com.biumall.ui,com.biumall.demo"

启动AccessibilityService

启动方式一

对于普通应用

Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
startActivity(intent);

进入设置开启无障碍无法。跳入后,找到自己的服务并进入开启即可。

启动方式二

隐藏内容!
付费阅读后才能查看!
1
多个隐藏块只需支付一次

参考文章

  1. AccessibilityService使用详解
  2. Android 无障碍服务AccessibilityService
  3. AccessibilityService从入门到出轨
  4. 安卓使用无障碍服务监听微信和QQ的收款信息

© 版权声明
导航号,我的单页导航

2 条评论

  • m
    m 游客

    学习

    回复
    • 改变自己
      改变自己 管理员

      已经发送邮件啦,请查收,谢谢支持

      回复