Android AccesibilityService не получает события

Я уже некоторое время бьюсь об стену с этой проблемой:

Эта служба доступности читает уведомления и обрабатывает их. Сначала он успешно работал на моем телефоне (Moto G4), но потом не работал ни на одном смартфоне, даже если этот самый код работает на эмуляторе на 100%.

У меня включена служба доступности приложения, и я, как правило, деактивирую ее и снова активирую на случай, если на некоторых тестовых прогонах я перезагрузил телефон и произвел полную установку приложения, а также активировал службу в настройках системы.

Меня поразило то, что, как упоминалось выше, этот код безупречно работает на эмуляторе, как и раньше, на моем телефоне. AccesibilityService просто не получает никаких событий на некоторых смартфонах.

Проверено на 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 больше не получает никаких событий?

2 ответа

Я столкнулся с этой проблемой 3 месяца назад, ваш сервис работает в указанном процессе android:process=":NotificationAccessibilityListener"Вот почему ваша служба доступности не работает на некоторых устройствах, просто удалите эту строку:

<service android:name=".features.services.NotificationAccessibilityListener"
            android:label="@string/app_name"
            android:enabled="true"
            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/accessibility_service_config" />

</service>

Была такая же проблема, все было так, чтобы искать ответы .. (это сработало раньше, затем я удалил вещи, которые, как мне казалось, были ненужными ..

Я тестировал это на самсунге,

      android:notificationTimeout="100"

заставил это работать .. у меня было это в 10 (может быть хорошо для симулятора / более быстрого телефона. но не телефон, который у меня был) ..

пришлось сделать это (может работать / нет ..)

      
        info.eventTypes = TYPE_WINDOW_STATE_CHANGED | TYPE_WINDOW_CONTENT_CHANGED | TYPE_VIEW_TEXT_CHANGED;
        info.feedbackType = AccessibilityServiceInfo.FEEDBACK_ALL_MASK;
        info.notificationTimeout = 100;
        this.setServiceInfo(info);
Другие вопросы по тегам