首页 > 解决方案 > 在 AccessibilityService 中检索 TYPE_TOUCH 和 TYPE_GESTURE

问题描述

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

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

所以我创建了一个AccessibilityService,现在我能够检测到这样的事件:VIEW_CLICKED, VIEW_SCROLLED. 但是,在我遇到的文档中,还有GESTURE_DETECTION_START,和. 我想用它们来衡量交互时间。不幸的是,尽管有正确的(?)配置,我的服务根本没有检索到这些事件。我当前的配置如下:GESTURE_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>
...

可访问性_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 方法不严格相关。

标签: androidtouchgestureaccessibilityservice

解决方案


经过一番挣扎后,我发现了问题(或一系列问题):

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

此元数据必须引用包含 <accessibility-service> 标记的 XML 资源

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

  • GESTURE_DETECTION_STARTGESTURE_DETECTION_END和是仅在触摸探索模式下可用的事件TOUCH_INTERACTION_STARTTOUCH_INTERACTION_END

所以android:canRequestTouchExplorationMode="true"并且android:accessibilityFlags="flagRequestTouchExplorationMode"在我的配置中丢失了。文档在Exploration types下列出了这些事件。

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

推荐阅读