在 AccessibilityService 中检索 TYPE_TOUCH 和 TYPE_GESTURE
Retrieve TYPE_TOUCH and TYPE_GESTURE in AccessibilityService
我正在开发一个应用程序,它应该收集用户与 Android 设备的交互(触摸相关数据),类似于 this SO post。
我已经尝试了所有答案的建议方法,从带有和不带有 WATCH_OUTSIDE_TOUCH
标志的应用程序覆盖开始。 getevent
方法也不适合我,因为它需要 root 或外部存储(如答案所述)。
所以我创建了一个 AccessibilityService
,现在我能够检测到这样的事件:VIEW_CLICKED
、VIEW_SCROLLED
。然而,在 documentation 中,我也遇到了 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" />
总而言之,我的服务正在启动并正确检索一些事件,但它缺少手势和触摸 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_START
、GESTURE_DETECTION_END
、TOUCH_INTERACTION_START
和 TOUCH_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" />
我正在开发一个应用程序,它应该收集用户与 Android 设备的交互(触摸相关数据),类似于 this SO post。
我已经尝试了所有答案的建议方法,从带有和不带有 WATCH_OUTSIDE_TOUCH
标志的应用程序覆盖开始。 getevent
方法也不适合我,因为它需要 root 或外部存储(如答案所述)。
所以我创建了一个 AccessibilityService
,现在我能够检测到这样的事件:VIEW_CLICKED
、VIEW_SCROLLED
。然而,在 documentation 中,我也遇到了 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" />
总而言之,我的服务正在启动并正确检索一些事件,但它缺少手势和触摸 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_START
、GESTURE_DETECTION_END
、TOUCH_INTERACTION_START
和TOUCH_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" />