私はしばらくの間、この問題で壁にぶつかっています:
このアクセシビリティ サービスは、通知を読み取って処理します。最初は私の電話 (Moto G4) で正常に動作しましたが、この同じコードがエミュレーターで 100% 動作しても、どのスマートフォンでも動作しませんでした。
私はアプリのアクセシビリティ サービスをオンにしており、一部のテスト実行で電話を再起動してアプリを完全にインストールし、システム設定でサービスを有効にした場合に備えて、それを無効にしてから再度有効にする傾向があります。
私を困惑させたのは、上記のように、このコードはエミュレーターで問題なく動作し、以前は私の電話でも動作していたことです。AccessibilityService は、一部のスマートフォンでイベントを受信しません。
Moto G4、LG G2、Asus、Huawei でテスト済み... Marshmallow / Lollipop を実行中 (動作していません)
エミュレーター API 16-19-23 でテスト済み、すべて期待どおりに動作します
public class NotificationAccessibilityListener extends AccessibilityService {
private AccessibilityServiceInfo info = new AccessibilityServiceInfo();
private static final String TAG = "NotificationAccListener";
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
final int eventType = event.getEventType();
if (eventType == TYPE_NOTIFICATION_STATE_CHANGED)
{
handleNotificationEvent(event);
}
else if (eventType == TYPE_WINDOW_STATE_CHANGED)
{
handleWindowStateEvent(event);
}
else {
Utils.log("onAccessibilityEvent -> Got un-handled Event");
}
}
@Override
public void onInterrupt() {}
@Override
public void onServiceConnected() {
// Set the type of events that this service wants to listen to.
// Others won't be passed to this service.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
info.eventTypes = TYPE_NOTIFICATION_STATE_CHANGED;
} else {
info.eventTypes = TYPE_NOTIFICATION_STATE_CHANGED | TYPE_WINDOW_STATE_CHANGED;
}
// Set the type of feedback your service will provide.
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_ALL_MASK;
// Default services are invoked only if no package-specific ones are present
// for the type of AccessibilityEvent generated. This service *is*
// application-specific, so the flag isn't necessary. If this was a
// general-purpose service, it would be worth considering setting the
// DEFAULT flag.
// info.flags = AccessibilityServiceInfo.DEFAULT;
info.notificationTimeout = 20;
this.setServiceInfo(info);
}
...
}
これは AndroidManifest.xml の宣言です
<service android:name=".features.services.NotificationAccessibilityListener"
android:label="@string/app_name"
android:enabled="true"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
android:process=":NotificationAccessibilityListener">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibility_service_config" />
</service>
ユーザー補助サービスの構成 xml
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/accessibility_service_description"
android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged"
android:accessibilityFeedbackType="feedbackAllMask"
android:notificationTimeout="20"
android:canRetrieveWindowContent="true"
/>
AccessibilityService がイベントを受信しなくなったのはなぜですか?