AccessibilityService запущен, но не получает AccessibilityEvents на JellyBean

У меня есть AccessibilityService, который должен считывать любые входящие уведомления. Он отлично работает с ICS и ниже, но перестал работать с JB.

Ниже приведены Манифест и код:

<service
        android:name=".Services.InstantMessengerJb"
        android:enabled="@bool/is_post_jb"
        android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
        tools:ignore="ExportedService" >
        <meta-data
            android:name="android.accessibilityservice"
            android:resource="@xml/accessibility_service_config" />

        <intent-filter>
            <action android:name="android.accessibilityservice.AccessibilityService" />
        </intent-filter>
    </service>

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    SettingsClass.logMe(tag, "New event!");
    new AccessibilityProcessing(this, event);
}

@Override
protected void onServiceConnected() {
    if (isInit) {
        return;
    }
    SettingsClass.logMe(tag, "We are connected!");
    AccessibilityServiceInfo info = new AccessibilityServiceInfo();
    info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
    info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
    setServiceInfo(info);
    isInit = true;
}

Как было сказано ранее, он работает на всех preJB-устройствах, как брелок, однако на JB служба запускается (я получаю "Мы подключены"), но не запускается ни одно событие.

Что-то не так с кодом?

2 ответа

Решение

Вот как я заставил это работать:

  1. Подкласс класса обслуживания, так что есть 2 версии этого.

  2. Иметь файл bools.xml в каталоге res/values, а также один в каталоге res/values-v16

  3. Установите для логического значения is_jelly_bean значение true в версии v16 и значение is_not_jelly_bean в версии каталога res/values

  4. В манифесте есть что-то вроде этого

    <service android:name=".service.MainRunningService" android:enabled="@bool/is_jelly_bean"
        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>
    
    <service android:name=".service.MainRunningServicePreJellyBean" 
        android:enabled="@bool/is_not_jelly_bean">
        <intent-filter >
            <action android:name="android.accessibilityservice.AccessibilityService" />
        </intent-filter>
    
        <meta-data
            android:name="android.accessibilityservice"
            android:resource="@xml/accessibilityservice" />
    </service>
    

Иметь XML-файл службы специальных возможностей в каталоге res/xml call accessibilityservice.xml

В нем есть что-то вроде этого:

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeNotificationStateChanged"
android:accessibilityFeedbackType="feedbackSpoken"
android:notificationTimeout="100"
android:description="@string/description_that_shows_on_the_accessibility_page" />

Я столкнулся с этой проблемой в Android 4.1.1. Служба специальных возможностей не получала события, пока я не отключил и снова не включил службу специальных возможностей.

Чтобы устранить проблему, я определил параметры службы доступности в обоих setServiceInfo() а также accessibilityservice.xml,

В моем случае не было необходимости определять две разные службы доступности, зависящие от версии Android.

Другие вопросы по тегам