Предупреждение: нарушение Google Play
Google пригрозил удалить приложения из Play Маркета, если они будут использовать службы специальных возможностей в целях, не связанных со специальными возможностями. Однако это, как сообщается, пересматривается.
Преимущества
- Протестировано и работает в 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.
24.12.2014
instanceof
проверок или без рефакторинга действий для совместного использования общего суперкласса или интерфейса. И если вы собираетесь реорганизовать действия, вы также можете сделать это так, чтобы это лучше соответствовало структуре и охватило больше сценариев, например, когда ни одно из ваших действий неактивно. №4, вероятно, наименее трудоемкий и самый гибкий. 07.10.2010