Peringatan: Pelanggaran Google Play
Google telah mengancam akan menghapus aplikasi dari Play Store jika mereka menggunakan layanan aksesibilitas untuk tujuan non-aksesibilitas. Namun, ini dilaporkan sedang dipertimbangkan kembali .
Manfaat
- Diuji dan bekerja di Android 2.2 (API 8) hingga Android 7.1 (API 25).
- Tidak memerlukan polling.
- Tidak memerlukan
GET_TASKS
izin.
Kekurangan
- Setiap pengguna harus mengaktifkan layanan di pengaturan aksesibilitas Android.
- Ini tidak 100% dapat diandalkan. Kadang-kadang acara tidak berjalan dengan baik.
- Layanan selalu berjalan.
- Ketika pengguna mencoba untuk mengaktifkan
AccessibilityService
, mereka tidak dapat menekan tombol OK jika aplikasi telah meletakkan overlay pada layar. Beberapa aplikasi yang melakukan ini adalah Velis Auto Brightness dan Lux. Ini bisa membingungkan karena pengguna mungkin tidak tahu mengapa mereka tidak bisa menekan tombol atau cara mengatasinya.
- Mereka
AccessibilityService
tidak akan mengetahui aktivitas saat ini sampai perubahan aktivitas pertama.
Contoh
Layanan
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
Gabungkan ini ke manifes Anda:
<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>
Info Layanan
Masukkan ini 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"/>
Mengaktifkan Layanan
Setiap pengguna aplikasi harus mengaktifkan secara eksplisit agar aplikasi AccessibilityService
tersebut dapat digunakan. Lihat jawaban StackOverflow ini untuk cara melakukan ini.
Perhatikan bahwa pengguna tidak akan dapat menekan tombol OK ketika mencoba mengaktifkan layanan aksesibilitas jika aplikasi telah meletakkan overlay pada layar, seperti Velis Auto Brightness atau Lux.