Cảnh báo: Vi phạm Google Play
Google đã đe dọa sẽ xóa ứng dụng khỏi Play Store nếu họ sử dụng các dịch vụ trợ năng cho các mục đích không truy cập được. Tuy nhiên, điều này được báo cáo đang được xem xét lại .
Những lợi ích
- Đã thử nghiệm và hoạt động trong Android 2.2 (API 8) cho đến Android 7.1 (API 25).
- Không yêu cầu bỏ phiếu.
- Không yêu cầu sự
GET_TASKS
cho phép.
Nhược điểm
- Mỗi người dùng phải kích hoạt dịch vụ trong cài đặt trợ năng của Android.
- Điều này không đáng tin cậy 100%. Đôi khi các sự kiện đến theo thứ tự.
- Dịch vụ này luôn chạy.
- Khi người dùng cố gắng bật
AccessibilityService
, họ không thể nhấn nút OK nếu ứng dụng đã đặt lớp phủ trên màn hình. Một số ứng dụng làm điều này là Velis Auto Brightness và Lux. Điều này có thể gây nhầm lẫn bởi vì người dùng có thể không biết tại sao họ không thể nhấn nút hoặc cách làm việc xung quanh nó.
- Các
AccessibilityService
sẽ không biết hoạt động hiện tại cho đến khi là người đầu tiên thay đổi hoạt động.
Thí dụ
Dịch vụ
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
Hợp nhất điều này vào bảng kê khai của bạn:
<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>
Thông tin dịch vụ
Đặt cái này vào 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"/>
Kích hoạt dịch vụ
Mỗi người dùng ứng dụng sẽ cần phải kích hoạt một cách rõ ràng AccessibilityService
để sử dụng ứng dụng. Xem câu trả lời StackOverflow này để biết cách làm điều này.
Lưu ý rằng người dùng sẽ không thể nhấn nút OK khi cố gắng bật dịch vụ trợ năng nếu ứng dụng đã đặt lớp phủ trên màn hình, chẳng hạn như Độ sáng tự động Velis hoặc Lux.