Получить TYPE_TOUCH и TYPE_GESTURE в AccessibilityService

Я разрабатываю приложение, которое должно собирать взаимодействие пользователя с устройством Android (данные, связанные с касанием), аналогично эта запись SO.

Я пробовал все предложенные подходы к ответу, начиная с наложения приложения с флагом WATCH_OUTSIDE_TOUCH и без него. Подход getevent также не подходит для меня, поскольку для него требуется root или внешнее хранилище (как указано в ответе).

Итак, я создал AccessibilityService и теперь могу обнаруживать такие события, как: VIEW_CLICKED, VIEW_SCROLLED. Однако в документации я также встречал GESTURE_DETECTION_START, GESTURE_DETECTION_END , TOUCH_INTERACTION_STARTи TOUCH_INTERACTION_END. Я хотел бы использовать их для измерения времени взаимодействия. К сожалению, моя служба вообще не получает эти события, несмотря на правильную (?) конфигурацию. Моя текущая конфигурация выглядит так:

AndroidManifest.xml:

...
<service
    android:name=".accessibility.MyAccessibilityService"
    android:label="@string/accessibility_service_label"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>
    <meta-data
        android:name="android.accessibilityervice"
        android:resource="@xml/accessibility_config" />
</service>
...

accessibility_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackAllMask"
    android:description="@string/accessibility_service_description"
    android:notificationTimeout="5"
    android:summary="@string/accessibility_service_description" />

Подводя итог, мой сервис запускается и получает некоторые события правильно, но ему не хватает жестов и событий запуска/завершения касания. Я пробовал много других конфигураций, включая все возможности и флаги, но без какого-либо эффекта. Также я попытался переопределить метод AccessibilityService::onGesture, но он так и не был вызван. Доступны ли эти события только в режиме сенсорного исследования?

Я описал свою проблему, возможно, слишком широко, но я был бы признателен за любую помощь или предложения, даже не связанные строго с подходом AccessibilityService.


person Jakub Licznerski    schedule 01.06.2018    source источник


Ответы (1)


После некоторой борьбы я узнал, в чем была проблема (или набор проблем):

  • Мой файл accessibility_config.xml был недействителен, так как он содержал тег <?xml version="1.0" encoding="utf-8"?> и согласно документам

Эти метаданные должны ссылаться на ресурс XML, содержащий тег ‹ службы доступности ›

Поэтому я сделал вывод, что для правильной работы нужен этот и только этот тег.

  • GESTURE_DETECTION_START, GESTURE_DETECTION_END, TOUCH_INTERACTION_START и TOUCH_INTERACTION_END — события, доступные только в режиме сенсорного исследования.

Так что android:canRequestTouchExplorationMode="true" и android:accessibilityFlags="flagRequestTouchExplorationMode" в моей конфигурации отсутствовали. В документах эти события перечислены в разделе Типы исследований.

РЕДАКТИРОВАТЬ: поделиться окончательным файлом accessibility_settings.xml:

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeViewTextChanged|typeViewFocused|typeViewLongClicked|typeViewClicked|typeViewScrolled|typeWindowStateChanged"
    android:accessibilityFeedbackType="feedbackHaptic"
    android:accessibilityFlags="flagIncludeNotImportantViews"
    android:canRetrieveWindowContent="true"
    android:description="@string/accessibility_service_description"
    android:notificationTimeout="10"
    android:settingsActivity="org.example.ExampleActivity" />
person Jakub Licznerski    schedule 05.06.2018
comment
Позволяет ли он получать уведомления обо всех событиях касания? Не могли бы вы поделиться примером этого на Github? - person android developer; 14.12.2020
comment
Привет @androiddeveloper, извините за поздний ответ! Я отредактировал свой пост с окончательным файлом xml, который я использовал в проекте. Это позволяет прослушивать все объявленные события. Проект является частным, поэтому я не могу поделиться всем репозиторием, но свяжитесь со мной, если у вас возникнут дополнительные вопросы. Я разработал его несколько лет назад, поэтому моя память немного размыта в деталях, однако я помню, что маска typeAllMask в некоторых случаях не работала, поэтому я использовал маску явных типов. - person Jakub Licznerski; 14.05.2021
comment
То есть это может работать при использовании в любом приложении, включая даже игры? Он может записывать, что делает пользователь? Можно ли сделать и наоборот? Смысл выполнять сенсорные события? Таким образом, вы можете записывать макросы... - person android developer; 30.05.2021
comment
Да, это правильно. Пока представление игры управляется вашим приложением. Точные координаты касания не работают, например. в накладках. Другим недостатком будет то, что для этого требуются определенные разрешения доступа, предоставленные пользователем вручную (у вас может быть намерение, указывающее на соответствующую страницу настроек, а не просто запрос на предоставление разрешений). Я не пробовал другое направление, но я подозреваю, что это возможно. Удачи :) - person Jakub Licznerski; 01.06.2021
comment
Что вы подразумеваете под До тех пор, пока представление игры управляется вашим приложением? - person android developer; 01.06.2021
comment
Я имел в виду не использовать наложение поверх какого-либо другого приложения (например, игры). В этом случае вы можете перехватить событие касания, но не можете передать его другим представлениям вниз. Это было мое исследование, пытающееся создать в основном кейлоггер для телефона (для некриминальных случаев использования: D) - person Jakub Licznerski; 02.06.2021
comment
Если ваше приложение имеет наложенный вид, вы не можете имитировать события касания? Не уверен, что понимаю. У вас есть POC для этого? - person android developer; 02.06.2021
comment
Я пытался зафиксировать все сенсорные события (особенно за пределами моего приложения), чтобы отслеживать взаимодействие пользователя со смартфоном. Пробовал с наложенным видом (всегда сверху, невидимым), который действовал бы как перехватчик для этих событий. Идея заключалась не в том, чтобы использовать событие касания и передавать его фактическому представлению приложения, но по соображениям безопасности это невозможно. Я пытался программно вызвать одно и то же событие касания, но мне это не удалось, и, к сожалению, у меня больше нет кода для этого. - person Jakub Licznerski; 04.06.2021
comment
Я так понимаю, это не связано с доступностью, верно? - person android developer; 05.06.2021
comment
да, скорее использовать специальные возможности Android для отслеживания взаимодействия - person Jakub Licznerski; 06.06.2021
comment
Вау здорово. Интересно, есть ли приложения, которые его используют. Было бы здорово иметь возможность записи и воспроизведения макросов. - person android developer; 06.06.2021