辅助功能服务:获取可以立即与之交互的视图(与“语音访问”相同)?

nic*_*Yes 6 android accessibility accessibility-api accessibilityservice android-accessibility

我们的目标是获得可与之交互的观点立刻(可以单击现在有什么东西会发生)。如果该视图通常可见且可单击,但已被另一个视图/菜单/侧面板悬停,则应将其省略。

语音访问可以做到这一点。它似乎使用了Accessibility API。

完美的例子是Google地图的底部菜单。展开后,下方的“沿路线搜索”按钮仍然可见,但应用突出显示。


那我们有什么呢?

  • 有一个AccessibilityEvent流。最有用的是 AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED,因此可以在发生事情时通知我们。
  • 使用getSource(),我们可以获取触发事件的AccessibilityNodeInfo的实例。或者我们可以使用AccessibilityService.getRootInActiveWindow()获得窗口的根。有了它,我们就可以遍历应用程序内的整个层次结构。
  • AccessibilityNodeInfo不提供有关视图的z顺序的任何信息,因此无法了解上方和下方的内容。
  • 底部菜单在同一窗口中(不是模式窗口)。
  • 如果在展开底部菜单时尝试单击“沿路线搜索”按钮,则底部菜单会折叠。因此,您实际上无法单击它,它在菜单下面。
  • 我已经通过的所有参数看上去AccessibilityNodeInfo一样isVisibleToUser()isClickable()isContextClickable()isSelected()isFocusable()isFocused()isAccessibilityFocused()和按钮具有相同的参数时,底部菜单被折叠/展开。用户可见,可聚焦和可点击。

  • 我研究了隐藏的API,没有发现任何有用的东西。

我想念的是什么?


在此处输入图片说明

nic*_*Yes 3

关键点是在AccessibilityService.onAccessibilityEvent()中,树层次结构不是最终的。要获取当前可交互的视图,应延迟调用AccessibilityService.getRootInActiveWindow() 。