предисловие
Чтобы использовать службу доступности, вы должны быть системным приложением, чтобы иметь разрешение. В противном случае никакое разрешение недействительно, и вы можете напрямую загрузить код.
1. Создайте настраиваемую службу AccessibilityService, которая наследует систему
public class AccessibilityService extends android.accessibilityservice.AccessibilityService {
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
}
@Override
public void onInterrupt() {
}
}
2. В файл манифеста необходимо добавить следующие разрешения и определения службы.
<!-- 无障碍权限 -->
<uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />
<!-- 无障碍定义清单 -->
<service
android:name="com.rishun.systemsetting.service.AccessibilityService"
android:enabled="true"
android:exported="true"
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_services" />
</service>
3. Создайте файл accessibility_services.xml в каталоге xml в каталоге ресурсов в соответствии с
accessibilityEventTypes: тип события, на которое следует реагировать (щелчок, длительное нажатие, слайд, уведомление и т. д.). какую информацию необходимо получить вашему приложению
description: Описание (вы увидите этот текст на странице специальных возможностей)
уведомлениеTimeout: интервал времени ответа 100
packageNames: имя пакета приложения, которому необходимо помочь, если не написано, это означает все приложения.
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagRequestFilterKeyEvents"
android:canRetrieveWindowContent="true"
android:canRequestFilterKeyEvents="true"
android:description="@string/app_name"
tools:ignore="MissingDefaultResource" />
4. Последний шаг можно вызвать в унаследованном классе Application.Этот метод должен открыть службу специальных возможностей, чтобы вы могли отслеживать события системных кнопок или другую информацию и статус интерфейса приложения в классе AccessibilityService, реализованном вами.
/**
* 开启无障碍服务
*/
public void openAccessibilityService(Context context){
//是否已开启无障碍服务
boolean isStartAccessibilityServiceEnable = false;
AccessibilityManager accessibilityManager = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
if (accessibilityManager != null) {
List<AccessibilityServiceInfo> accessibilityServices = accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
for (AccessibilityServiceInfo info : accessibilityServices) {
if (info.getId().contains(context.getPackageName())) {
isStartAccessibilityServiceEnable = true;
Log.i("AccessibilityService", "已开启无障碍服务.");
break;
}
}
}
if (!isStartAccessibilityServiceEnable) {
String enabledServices = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
ComponentName selfComponentName = new ComponentName(context.getPackageName(), AccessibilityService.class.getCanonicalName());
String flattenToStr = selfComponentName.flattenToString();
if (enabledServices == null || !enabledServices.contains(flattenToStr)) {
enabledServices += ":" + flattenToStr;
}
//开启服务
isStartAccessibilityServiceEnable = Settings.Secure.putString(context.getContentResolver(),Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, enabledServices);
Settings.Secure.putInt(context.getContentResolver(),Settings.Secure.ACCESSIBILITY_ENABLED, 1);
Log.i("AccessibilityService", "开启无障碍服务,enable:"+isStartAccessibilityServiceEnable);
}
}