Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么AccessibilityService的onAccessibilityEvent(..)方法多次读取同一视图?_Android_Accessibility_Accessibilityservice_Android Accessibility - Fatal编程技术网

Android 为什么AccessibilityService的onAccessibilityEvent(..)方法多次读取同一视图?

Android 为什么AccessibilityService的onAccessibilityEvent(..)方法多次读取同一视图?,android,accessibility,accessibilityservice,android-accessibility,Android,Accessibility,Accessibilityservice,Android Accessibility,我使用AccessibilityService来确定在android设备上运行的任何当前应用程序的文本和视图坐标。 在每个事件上,onAccessibilityEvent(…)都会运行,但我不知道如何控制这些事件。我使用event.getSource()获取每个窗口内容更改的结果。my AccessibilityService的xml设置为: <?xml version="1.0" encoding="utf-8"?> <accessibility-service xmlns:

我使用AccessibilityService来确定在android设备上运行的任何当前应用程序的文本和视图坐标。 在每个事件上,onAccessibilityEvent(…)都会运行,但我不知道如何控制这些事件。我使用event.getSource()获取每个窗口内容更改的结果。my AccessibilityService的xml设置为:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeWindowContentChanged|typeViewFocused"
    android:accessibilityFlags="flagIncludeNotImportantViews|flagReportViewIds"
    android:canRetrieveWindowContent="true"
    android:canRequestTouchExplorationMode="true"
    android:packageNames="com.whatsapp"
    android:accessibilityFeedbackType="feedbackSpoken"

/>
我得到的输出是(我用粗体突出显示了文本值:

08-18 19:34:29.055 20131-20131/com.example.root.without_root E/MyService:: Get Source output: android.view.accessibility.AccessibilityNodeInfo@801b6813; boundsInParent: Rect(0, 0 - 548, 46); boundsInScreen: Rect(144, 1095 - 692, 1141); packageName: com.device; className: android.widget.TextView; **text: Samsung**; error: null; maxTextLength: -1; contentDescription: null; viewIdResName: com.whatsapp:id/name; checkable: false; checked: false; focusable: false; focused: false; selected: false; clickable: false; longClickable: false; enabled: true; password: false; scrollable: false; actions: [AccessibilityAction: ACTION_SELECT - null, AccessibilityAction: ACTION_CLEAR_SELECTION - null, AccessibilityAction: ACTION_ACCESSIBILITY_FOCUS - null, AccessibilityAction: ACTION_NEXT_AT_MOVEMENT_GRANULARITY - null, AccessibilityAction: ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY - null, AccessibilityAction: ACTION_SET_SELECTION - null]

08-18 19:34:29.058 20131-20131/com.example.root.without_root E/MyService:: Get Source output: android.view.accessibility.AccessibilityNodeInfo@801b6813; boundsInParent: Rect(0, 0 - 548, 46); boundsInScreen: Rect(144, 1095 - 692, 1141); packageName: com.device; className: android.widget.TextView; **text: Samsung**; error: null; maxTextLength: -1; contentDescription: null; viewIdResName: com.whatsapp:id/name; checkable: false; checked: false; focusable: false; focused: false; selected: false; clickable: false; longClickable: false; enabled: true; password: false; scrollable: false; actions: [AccessibilityAction: ACTION_SELECT - null, AccessibilityAction: ACTION_CLEAR_SELECTION - null, AccessibilityAction: ACTION_ACCESSIBILITY_FOCUS - null, AccessibilityAction: ACTION_NEXT_AT_MOVEMENT_GRANULARITY - null, AccessibilityAction: ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY - null, AccessibilityAction: ACTION_SET_SELECTION - null]

08-18 19:34:29.061 20131-20131/com.example.root.without_root E/MyService:: Get Source output: android.view.accessibility.AccessibilityNodeInfo@801b6813; boundsInParent: Rect(0, 0 - 548, 46); boundsInScreen: Rect(144, 1095 - 692, 1141); packageName: com.whatsapp; className: android.widget.TextView; **text: Samsung**; error: null; maxTextLength: -1; contentDescription: null; viewIdResName: com.device:id/name; checkable: false; checked: false; focusable: false; focused: false; selected: false; clickable: false; longClickable: false; enabled: true; password: false; scrollable: false; actions: [AccessibilityAction: ACTION_SELECT - null, AccessibilityAction: ACTION_CLEAR_SELECTION - null, AccessibilityAction: ACTION_ACCESSIBILITY_FOCUS - null, AccessibilityAction: ACTION_NEXT_AT_MOVEMENT_GRANULARITY - null, AccessibilityAction: ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY - null, AccessibilityAction: ACTION_SET_SELECTION - null]
08-18 19:34:29.064 20131-20131/com.example.root.without_root E/MyService:: Get Source output: android.view.accessibility.AccessibilityNodeInfo@801b6bd4; boundsInParent: Rect(0, 0 - 548, 38); boundsInScreen: Rect(144, 1141 - 692, 1179); packageName: com.whatsapp; className: android.widget.TextView; text: ☺; error: null; maxTextLength: -1; contentDescription: null; viewIdResName: com.whatsapp:id/status; checkable: false; checked: false; focusable: false; focused: false; selected: false; clickable: false; longClickable: false; enabled: true; password: false; scrollable: false; actions: [AccessibilityAction: ACTION_SELECT - null, AccessibilityAction: ACTION_CLEAR_SELECTION - null, AccessibilityAction: ACTION_ACCESSIBILITY_FOCUS - null, AccessibilityAction: ACTION_NEXT_AT_MOVEMENT_GRANULARITY - null, AccessibilityAction: ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY - null, AccessibilityAction: ACTION_SET_SELECTION - null]
现在您可以看到,它只在一个视图中运行了3次,但我希望它只在一个视图中运行一次。请帮助我了解如何实现这一点

我已经尝试过将xml中accessibilityEventTypes的值从“typeAllMasks”更改为“typeWindowContentChanged”和“typeViewFocused”,但没有任何帮助

我还尝试在AccessibilityService的onAccessibilityEvent(…)中设置标志,但这也不起作用,因为该服务每次都在运行(如果有人能让它工作就太好了)


请告诉我如何才能工作。

< P>可访问事件发生得非常频繁。所以,首先,我想让你考虑一下,你是否真的想忽略这些事件。你想知道什么样的用户体验问题?

<>特别是,将要发生的很多问题是Windows CoprTeC改事件和VIEW聚焦事件。您可以考虑做的事情是节流事件。下面的更改到Service配置XML将限制每一个特定的事件类型发生一次半秒。

事件通知超时有助于避免将事件过于频繁地传播到客户端,因为这是通过昂贵的进程间调用完成的。可以将超时视为确定事件生成何时结束的标准

因此,您的服务配置xml如下所示:

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeWindowContentChanged|typeViewFocused"
android:accessibilityFlags="flagIncludeNotImportantViews|flagReportViewIds"
android:canRetrieveWindowContent="true"
android:canRequestTouchExplorationMode="true"
android:packageNames="com.whatsapp"
android:accessibilityFeedbackType="feedbackSpoken"
android:notificationTimeout="500"
/>


但是,值得注意的是,您可能会错过事件。因此,如果您依赖于与这些事件保持同步,您可能会希望将其设置得更低。这是一种平衡行为。

感谢您的回复,我已经按照u所说的方式编辑了xml文件,并获得了一些更好的结果。在notificationTimeout中,我将其值仅设置为“1”,现在我得到一个TextView值1-2次,而不是5-7次。那么有没有办法将其减少到只有1次。将其值设置为“2”会丢失一些TextView。我需要介于1和2之间的某个位置,但我们无法在android中设置浮点值:notificationTimeout=“”,我尝试在dimen中添加一个浮点值,但这导致了一个错误,即“notificationTimeout”中不允许使用浮点值。该值为毫秒。因此,“float”不太可能有帮助,此时您有一个竞争条件。设置为“1”是什么是的,只是限制立即连续发生的事件,这是好的。但是,不,您不能再进一步限制,而不冒丢失事件的风险…因此,竞争条件。任何进一步的逻辑都需要在代码中完成。我在xml配置中没有设置notificationTimeout就获得了结果。我删除了通知超时,因为有时我无法获取所需的数据。我已经为在onAccessibilityEvent(..)之前运行的任务设置了计时器。无论如何,感谢您,onAccessibilityEvent(..)可以做任何事情来破坏我的代码。
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeWindowContentChanged|typeViewFocused"
android:accessibilityFlags="flagIncludeNotImportantViews|flagReportViewIds"
android:canRetrieveWindowContent="true"
android:canRequestTouchExplorationMode="true"
android:packageNames="com.whatsapp"
android:accessibilityFeedbackType="feedbackSpoken"
android:notificationTimeout="500"
/>