AccessibilityEvent.getPackageName() возвращает ноль

Я регистрирую AccessibilityService для прослушивания изменений приложения. Он работает на всех телефонах, которые я тестировал, но на Galaxy A3 с Android 5.0 происходит сбой, потому что AccessibilityEvent.getPackageName() возвращает ноль. Необходимо указать имя_пакета, так как это обычное приложение, загружаемое из Google play и взаимодействующее с ним.

Кто-нибудь знает почему это и как это исправить?

Ниже приведены соответствующие части моего кода.

<service
    android:name=".presentation.view.services.LockService"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <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 onServiceConnected() {
  AccessibilityServiceInfo info = new AccessibilityServiceInfo();

  info.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
  info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
  info.notificationTimeout = 100;

  this.setServiceInfo(info);
}

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
  event.getPackageName() // returns NULL;
}

0 ответов

Поскольку документация не объясняет это конкретно, я постараюсь предоставить кое-что, что я придумал после игры с AccessibilityService, Я пишу это на всякий случай, если другие бьют их головы, потому что event.getPackageName() всегда возвращается null, но не принимайте мои слова как должное.

Из документации службы доступности я вижу, что вы можете установить атрибут android:packageNames="@strings/blah_blah", где blah_blah это разделенный запятыми список имен пакетов, которые будет наблюдать наш сервис.

Если мы укажем этот атрибут, мы получим уведомление только для этих конкретных пакетов и event.getPackageName() вернет правильное имя пакета.

Если мы оставим этот атрибут неустановленным или мы специально установим его на null мы будем уведомлены обо всех событиях, которые происходят, но мы потеряем способность идентифицировать, какой конкретный пакет "сгенерировал" событие доступности.

Как это AccessibilityServiceInfo свойство может быть установлено динамически, теоретически вы можете получить список установленных в данный момент пакетов и установить его как packageNames что ваш сервис будет контролировать.

@Override
protected void onServiceConnected() {
    super.onServiceConnected();
    AccessibilityServiceInfo info = getServiceInfo();
    // your other assignments
    info.packageNames = new String[]{...};
    setServiceInfo(info);
}
Другие вопросы по тегам