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 запускается служба (я получаю "Мы подключены" ), но не запускается ни одно событие.
Что-то не так с кодом?
Ответы
Ответ 1
Вот как я его заработал:
-
Подкласс класса сервиса, поэтому есть две его версии.
-
Имейте файл bools.xml в каталоге res/values, а также в каталоге res/values-v16
-
Если значение is_jelly_bean boolean установлено равным true в v16 и is_not_jelly_bean в версии каталога res/values
-
В манифесте есть что-то вроде этого
<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" />
Ответ 2
У меня возникла эта проблема в Android 4.1.1. Служба доступности не получала события, пока я не отключил и не включил службу доступности.
Чтобы устранить проблему, я определил параметры службы доступности в как setServiceInfo()
, так и accessibilityservice.xml
.
В моем случае не было необходимости определять две различные службы доступности, зависящие от Android-версии.