Попередження: порушення Google Play
Google погрожував видалити додатки з Play Store, якщо вони використовуватимуть послуги доступності в цілях недоступності. Однак, як повідомляється, це питання переглядається .
Переваги
- Тестується та працює в Android 2.2 (API 8) через Android 7.1 (API 25).
- Не вимагає опитування.
- Не вимагає
GET_TASKS
дозволу.
Недоліки
- Кожен користувач повинен включити послугу в налаштуваннях доступності Android.
- Це не на 100% надійно. Іноді події відбуваються поза порядком.
- Послуга завжди працює.
- Коли користувач намагається ввімкнути функцію
AccessibilityService
, він не може натиснути кнопку ОК, якщо програма розмістила на екрані накладку. Деякі програми, які роблять це, - це Velis Auto Brightness та Lux. Це може заплутати те, що користувач може не знати, чому він не може натиснути кнопку або як обійти її.
AccessibilityService
Чи не буде знати поточну діяльність до першого зміни активності.
Приклад
Сервіс
public class WindowChangeDetectingService extends AccessibilityService {
@Override
protected void onServiceConnected() {
super.onServiceConnected();
//Configure these here for compatibility with API 13 and below.
AccessibilityServiceInfo config = new AccessibilityServiceInfo();
config.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
config.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
if (Build.VERSION.SDK_INT >= 16)
//Just in case this helps
config.flags = AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
setServiceInfo(config);
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
if (event.getPackageName() != null && event.getClassName() != null) {
ComponentName componentName = new ComponentName(
event.getPackageName().toString(),
event.getClassName().toString()
);
ActivityInfo activityInfo = tryGetActivity(componentName);
boolean isActivity = activityInfo != null;
if (isActivity)
Log.i("CurrentActivity", componentName.flattenToShortString());
}
}
}
private ActivityInfo tryGetActivity(ComponentName componentName) {
try {
return getPackageManager().getActivityInfo(componentName, 0);
} catch (PackageManager.NameNotFoundException e) {
return null;
}
}
@Override
public void onInterrupt() {}
}
AndroidManifest.xml
Об’єднайте це у свій маніфест:
<application>
<service
android:label="@string/accessibility_service_name"
android:name=".WindowChangeDetectingService"
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/accessibilityservice"/>
</service>
</application>
Інформація про службу
Помістіть це res/xml/accessibilityservice.xml
:
<?xml version="1.0" encoding="utf-8"?>
<!-- These options MUST be specified here in order for the events to be received on first
start in Android 4.1.1 -->
<accessibility-service
xmlns:tools="http://schemas.android.com/tools"
android:accessibilityEventTypes="typeWindowStateChanged"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagIncludeNotImportantViews"
android:description="@string/accessibility_service_description"
xmlns:android="http://schemas.android.com/apk/res/android"
tools:ignore="UnusedAttribute"/>
Увімкнення послуги
Кожному користувачеві програми потрібно буде чітко ввімкнути його AccessibilityService
, щоб ним можна було користуватися. Дивіться цю відповідь StackOverflow, як це зробити.
Зауважте, що користувач не зможе натиснути кнопку ОК, намагаючись увімкнути послугу доступності, якщо програма розмістить на екрані накладку, наприклад Velis Auto Brightness або Lux.