Uyarı: Google Play ihlali
Google, erişilebilirlik hizmetlerini erişilemezlik amacıyla kullanıyorsa uygulamaları Play Store'dan kaldırmakla tehdit etti. Bununla birlikte, bunun yeniden değerlendirildiği bildirilmektedir .
Yararları
- Android 7.1 (API 25) aracılığıyla Android 2.2'de (API 8) test edildi ve çalışıyor.
- Yoklama gerektirmez.
GET_TASKS
İzin gerektirmez .
Dezavantajları
- Her kullanıcının hizmeti Android'in erişilebilirlik ayarlarında etkinleştirmesi gerekir.
- Bu% 100 güvenilir değil. Bazen olaylar sıra dışı olur.
- Hizmet her zaman çalışıyor.
- Bir kullanıcı etkinleştirmeye çalıştığında
AccessibilityService
, bir uygulama ekrana bir yer paylaşımı yerleştirmişse Tamam düğmesine basamaz. Bunu yapan bazı uygulamalar Velis Auto Brightness ve Lux'tur. Bu kafa karıştırıcı olabilir, çünkü kullanıcı düğmeye neden basamayacağını veya etrafta nasıl çalışacağını bilemeyebilir.
AccessibilityService
İlk kadar geçerli aktiviteyi anlayamayacaksınız değişim faaliyetinin.
Misal
Hizmet
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
Bunu manifestinizde birleştirin:
<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>
Servis Bilgisi
Şunu koyun 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"/>
Hizmeti Etkinleştirme
Uygulamanın her kullanıcısının kullanılabilmesi için açık bir şekilde etkinleştirmesi gerekir AccessibilityService
. Bunun nasıl yapılacağı için bu StackOverflow yanıtına bakın .
Bir uygulama ekrana Velis Auto Brightness veya Lux gibi bir yer paylaşımı yerleştirmişse, erişilebilirlik hizmetini etkinleştirmeye çalışırken kullanıcının OK düğmesine basamayacağını unutmayın.