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、就是辅助功能权限丢失,明明刚刚给权限,结果自己又没有了