在 AccessibilityService 中检索 TYPE_TOUCH 和 TYPE_GESTURE

Retrieve TYPE_TOUCH and TYPE_GESTURE in AccessibilityService

我正在开发一个应用程序,它应该收集用户与 Android 设备的交互(触摸相关数据),类似于 this SO post

我已经尝试了所有答案的建议方法,从带有和不带有 WATCH_OUTSIDE_TOUCH 标志的应用程序覆盖开始。 getevent 方法也不适合我,因为它需要 root 或外部存储(如答案所述)。

所以我创建了一个 AccessibilityService,现在我能够检测到这样的事件:VIEW_CLICKEDVIEW_SCROLLED。然而,在 documentation 中,我也遇到了 GESTURE_DETECTION_STARTGESTURE_DETECTION_ENDTOUCH_INTERACTION_STARTTOUCH_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" />

总而言之,我的服务正在启动并正确检索一些事件,但它缺少手势和触摸 start/end 事件。我尝试了许多其他配置,包括启用的所有功能和标志,但没有任何效果。我也尝试覆盖一个方法 AccessibilityService::onGesture 但它从未被调用过。此事件仅在触摸探索模式下可用吗?

我描述的问题可能有点过于宽泛,但我将不胜感激任何帮助或建议,即使与 AccessibilityService 方法无关。

经过一番努力,我发现了问题所在(或一组问题):

  • 我的 accessibility_config.xml 文件无效,因为它包含 <?xml version="1.0" encoding="utf-8"?> 标签,并且根据 docs

This meta-data must reference an XML resource containing < accessibility-service > tag

所以我推断它需要这个并且只有这个标签才能正常工作。

  • GESTURE_DETECTION_STARTGESTURE_DETECTION_ENDTOUCH_INTERACTION_STARTTOUCH_INTERACTION_END 是仅在触摸探索模式下可用的事件。

所以我的配置中缺少 android:canRequestTouchExplorationMode="true"android:accessibilityFlags="flagRequestTouchExplorationMode"docs 探索类型 下招募那些事件。

编辑: 共享最终 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" />