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 служба запускается (я получаю «Мы подключены»), но не запускается ни одно событие.

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


person Force    schedule 18.08.2012    source источник
comment
Я нашел, что это работает, но только если определено декларативно. Вам также потребуется добавить новое разрешение на привязку и иметь некоторую условную логику, чтобы определить, работает ли он в мармеладке, иначе старые телефоны не будут работать с новым параметром привязки. Я постараюсь собрать пример вместе.   -  person Andrew    schedule 20.08.2012
comment
Я заметил, что на некоторых устройствах заявленное разрешение на привязку все еще работает нормально с песком для мороженого, но не с имбирным хлебом.   -  person logray    schedule 02.03.2013
comment
ааа.. поправочка: служба доступа к привязке == API 16, но похоже, что она игнорируется и все еще работает в API 15   -  person logray    schedule 02.03.2013


Ответы (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 и вызовите 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" />
person Andrew    schedule 20.08.2012
comment
Спасибо за Ваш ответ! Обратите внимание, что я уже использую модифицированный сервис для JB (см. код), но я попробую его с описанием сервиса в файле XML и отчитаюсь. - person Force; 20.08.2012
comment
Это то, что я обнаружил, имеет значение. Я понятия не имею, почему версия кода просто не работает. - person Andrew; 21.08.2012
comment
Это работало для меня на Android 4.1.1, но не работало на Android 4.2 без фильтра намерений в версии объявления службы для желейных бобов. Очевидно, вам также необходимо добавить папку value-v17 для учета изменений SDK. - person Rupert Rawnsley; 15.11.2012
comment
@RupertRawnsley Я предполагаю, что ваш целевой SDK установлен на 17. На данный момент я использую только цель 16, и она все еще работает. - person Andrew; 15.11.2012
comment
@Andrew Согласно Google, вы должны иметь возможность выполнить эту настройку в setServiceInfo () .... это не работает? У меня похожая проблема - person onetwopunch; 19.01.2013
comment
@ECEsurfer - нет, к сожалению, не в желейных бобах. Я уверен, что это ошибка в андроиде - person Andrew; 19.01.2013
comment
Чтобы это заработало, мне пришлось добавить элемент <category> в is_jelly_bean <intent-filter>. В качестве примера я использовал TalkBack, взяв категорию из источник - person benizi; 08.08.2013
comment
Хороший обходной путь. Должен быть лучший способ, но на данный момент это работает для меня. (Отмечу, что если сервис один и тот же для каждой версии, кажется, нет необходимости создавать подклассы. Для меня от версии к версии отличался только манифест.) - person Novak; 22.08.2014
comment
Я предполагаю, что books.xml - это опечатка bools.xml? - person Sam; 12.06.2015
comment
Удивительный человек не ожидал, что сможет исправить эту неприятную ошибку!! - person HiDd3N; 15.01.2021

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

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

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

person Sam    schedule 12.06.2015