Warnung: Google Play-Verstoß
Google hat damit gedroht , Apps aus dem Play Store zu entfernen, wenn sie Barrierefreiheitsdienste für nicht barrierefreie Zwecke verwenden. Dies wird jedoch Berichten zufolge überdacht .
Leistungen
- Getestet und funktioniert in Android 2.2 (API 8) bis Android 7.1 (API 25).
- Benötigt keine Abfrage.
- Benötigt keine
GET_TASKS
Erlaubnis.
Nachteile
- Jeder Benutzer muss den Dienst in den Eingabehilfen von Android aktivieren.
- Dies ist nicht 100% zuverlässig. Gelegentlich sind die Ereignisse nicht in Ordnung.
- Der Dienst wird immer ausgeführt.
- Wenn ein Benutzer versucht, das zu aktivieren
AccessibilityService
, kann er die OK-Taste nicht drücken, wenn eine App eine Überlagerung auf dem Bildschirm platziert hat. Einige Apps, die dies tun, sind Velis Auto Brightness und Lux. Dies kann verwirrend sein, da der Benutzer möglicherweise nicht weiß, warum er die Taste nicht drücken kann oder wie er sie umgehen kann.
- Die
AccessibilityService
aktuelle Aktivität wird erst bei der ersten Änderung der Aktivität bekannt.
Beispiel
Bedienung
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
Füge dies in dein Manifest ein:
<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>
Serviceinfo
Geben Sie dies ein 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"/>
Aktivieren des Dienstes
Jeder Benutzer der App muss das explizit aktivieren AccessibilityService
, damit es verwendet werden kann. Informationen dazu finden Sie in dieser StackOverflow-Antwort .
Beachten Sie, dass der Benutzer die OK-Taste nicht drücken kann, wenn er versucht, den Eingabehilfedienst zu aktivieren, wenn eine App eine Überlagerung auf dem Bildschirm platziert hat, z. B. Velis Auto Brightness oder Lux.