辅助功能服务:获取可以立即交互的视图(与语音访问相同)?
Accessibility service: get views you can interact with instantly (same as Voice Access)?
目标是获得可以立即进行交互的视图(可以立即点击,然后会发生一些事情)。如果视图通常可见且可点击,但悬停在另一个 view/menu/side 面板上,则应将其省略。
Voice Access 这样做。而且它似乎使用辅助功能 API.
最好的例子是 Google 地图中的底部菜单。当它展开时,下面的 "Search along the route" 按钮仍然可见,但它未 被应用高亮显示。
那我们有什么?
- 有一个 AccessibilityEvent 的流。最有用的是
AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED,这样我们就可以在有事情发生时得到通知。
- 用getSource() we can get an instance of AccessibilityNodeInfo触发事件。
或者我们可以用 AccessibilityService.getRootInActiveWindow() 得到 window 的根。有了它,我们就可以遍历应用程序中的整个层次结构。
- AccessibilityNodeInfo 不提供有关视图 z 顺序的任何信息,因此无法理解上方和下方的内容。
- 底部菜单在同一个 window(不是模态)。
- 如果您在底部菜单展开时尝试单击 "Search along the route" 按钮,底部菜单会折叠。所以你实际上不能点击它,它在菜单下面。
我查看了 AccessibilityNodeInfo 的所有参数,例如 isVisibleToUser()
、isClickable()
、isContextClickable()
、isSelected()
、 isFocusable()
、isFocused()
、isAccessibilityFocused()
和底部菜单为collapsed/expanded时按钮参数相同。它对用户可见、可聚焦和可点击。
我查看了隐藏的 APIs,没有发现任何有用的东西。
我错过了什么?
关键点是AccessibilityService.onAccessibilityEvent() the tree hierarchy is not final. To get views that are interactable at the moment, AccessibilityService.getRootInActiveWindow()应该延迟调用。
AccessibilityNodeInfo#getDrawingOrder() 可能会对您有所帮助。请注意,您需要进行树遍历以确定什么在什么之上。
仍然有透明视图的极端情况会给您带来麻烦,但这应该可以帮助您完成 95% 的工作。我们正在为这种情况寻找更好的答案。
目标是获得可以立即进行交互的视图(可以立即点击,然后会发生一些事情)。如果视图通常可见且可点击,但悬停在另一个 view/menu/side 面板上,则应将其省略。
Voice Access 这样做。而且它似乎使用辅助功能 API.
最好的例子是 Google 地图中的底部菜单。当它展开时,下面的 "Search along the route" 按钮仍然可见,但它未 被应用高亮显示。
那我们有什么?
- 有一个 AccessibilityEvent 的流。最有用的是 AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED,这样我们就可以在有事情发生时得到通知。
- 用getSource() we can get an instance of AccessibilityNodeInfo触发事件。 或者我们可以用 AccessibilityService.getRootInActiveWindow() 得到 window 的根。有了它,我们就可以遍历应用程序中的整个层次结构。
- AccessibilityNodeInfo 不提供有关视图 z 顺序的任何信息,因此无法理解上方和下方的内容。
- 底部菜单在同一个 window(不是模态)。
- 如果您在底部菜单展开时尝试单击 "Search along the route" 按钮,底部菜单会折叠。所以你实际上不能点击它,它在菜单下面。
我查看了 AccessibilityNodeInfo 的所有参数,例如
isVisibleToUser()
、isClickable()
、isContextClickable()
、isSelected()
、isFocusable()
、isFocused()
、isAccessibilityFocused()
和底部菜单为collapsed/expanded时按钮参数相同。它对用户可见、可聚焦和可点击。我查看了隐藏的 APIs,没有发现任何有用的东西。
我错过了什么?
关键点是AccessibilityService.onAccessibilityEvent() the tree hierarchy is not final. To get views that are interactable at the moment, AccessibilityService.getRootInActiveWindow()应该延迟调用。
AccessibilityNodeInfo#getDrawingOrder() 可能会对您有所帮助。请注意,您需要进行树遍历以确定什么在什么之上。
仍然有透明视图的极端情况会给您带来麻烦,但这应该可以帮助您完成 95% 的工作。我们正在为这种情况寻找更好的答案。