目录
前言
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);
进入设置开启无障碍无法。跳入后,找到自己的服务并进入开启即可。
启动方式二
参考文章
© 版权声明
学习
已经发送邮件啦,请查收,谢谢支持