Android 辅助功能使用

本文介绍了如何在Android中实现辅助功能服务,包括创建 AccessibilityService,配置清单文件和accessibility.xml,以及如何在MyAccessibilityService 中处理事件。通过遍历文字匹配或通过ID查找节点来模拟操作。然而,辅助功能存在稳定性问题,如数据获取不准确和权限丢失等挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android 系统有一个功能是专门为残障人士准备的,辅助功能,可以帮助做很多事,比如点击按钮
一、创建类实现AccessibilityService

public class MyAccessibilityService extends AccessibilityService {
        @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        //写一些配置文件在这里
        AccessibilityServiceInfo info = new AccessibilityServiceInfo();
        // We are interested in all types of accessibility events.
        info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
        // We want to provide specific type of feedback.
        info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
        // We want to receive events in a certain interval.
        info.notificationTimeout = 3000;
        // We want to receive accessibility events only from certain packages.
        info.packageNames = new String[]{"com.android.settings","com.lxy.accessibilityutil"};
        setServiceInfo(info);
    }
      @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
    // 通过这个函数可以接收系统发送来的AccessibilityEvent,接收来的AccessibilityEvent是经过过滤的,
    // 过滤是在配置工作时设置的。
      }    
          @Override
    public void onInterrupt() {
    // 这个在系统想要中断AccessibilityService返给的响应时会调用。在整个生命周期里会被调用多次。
        Log.e(THIS_FILE,"onInterrupt中断了");
    }  
     @Override
    public boolean onUnbind(Intent intent) {
    //  在系统将要关闭这个AccessibilityService会被调用。在这个方法中进行一些释放资源的工作。
        Log.e(THIS_FILE,"onUnbind解绑了");
        return super.onUnbind(intent);
    }
}

二、在清单文件里配置

 <service
     android:name="com.lxy.accessibilityutil.MyAccessibilityService"
     android:label="@string/app_name"
     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/accessibility" />
 </service>

三、资源文件accessibility.xml

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackSpoken"
    android:canRetrieveWindowContent="true"
    android:description="@string/desc"
    android:packageNames="com.android.settings"
    android:notificationTimeout="3000"/>

四、辅助功能配置已经完成了,到手机设置里开启辅助功能权限就可以接受到事件了,现在聊聊这个事件获取和使用,是在MyAccessibilityService 类中onAccessibilityEvent(AccessibilityEvent event)方法接收到事件的响应。几种思路。
1、获得AccessibilityEvent 之后遍历所有的文字,然后和自己需要点击的文字进行匹配,找到后点击

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
// 通过这个函数可以接收系统发送来的AccessibilityEvent,接收来的AccessibilityEvent是经过过滤的,
// 过滤是在配置工作时设置的。
 AccessibilityNodeInfo mNodeInfo1 = service.getRootInActiveWindow();
        findChildNode(mNodeInfo1);
}   
private void findChildNode(AccessibilityNodeInfo child) {
    if (child != null) {
        int count = child.getChildCount();
        for (int i = 0; i < count; ++i) {
            CharSequence text = child.getChild(i).getText();
            if (text != null) {
                if (containsText(text.toString(), launcherName)) {
                    Log.e(THIS_FILE,"开始点击了");
                     getParentNode(child.getChild(i));
                     break;
                }
            }
            if (child.getChild(i) != null) {
                findChildNode(child.getChild(i));
            }
        }
    }
}
private boolean containsText(String text, String[] info) {
    for (int i = 0; i < info.length; ++i) {
        Log.e(THIS_FILE, "text:" + text + "**info:" + info[i]);
        if (text.contains(info[i])) {//info[]是你要查找的文字数组
            Log.e(THIS_FILE,"开始点击了0");
            return true;
        }
    }
      return false;
}

2、通过文字来找到对应的节点和通过id来查找节点

findAccessibilityNodeInfosByViewId(String str)
findAccessibilityNodeInfosByText(String str)

最后、我想说的是辅助功能特别的不稳定,1、获得数据不稳定,比如其中的获得launcher的个数就和实际的替换桌面的节点不相等 2、就是辅助功能权限丢失,明明刚刚给权限,结果自己又没有了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值