繁体   English   中英

辅助功能服务:获取您可以即时互动的视图(与语音访问相同)?

[英]Accessibility service: get views you can interact with instantly (same as Voice Access)?

我们的目标是获得可与瞬间 (可以单击现在有什么东西会发生)进行交互的意见。 如果视图一般可见且可点击但由另一个视图/菜单/侧面板悬停,则应省略该视图。

Voice Access可以做到这一点。 它似乎使用Accessibility API。

完美的例子是谷歌地图的底部菜单。 当它展开时,下面的“沿着路线搜索”按钮仍然可见,但应用程序没有突出显示它。


那么我们有什么?

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

  • 我查看了隐藏的API,但没有看到任何有用的东西。

我错过了什么?


在此输入图像描述

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

AccessibilityNodeInfo#getDrawingOrder()可能会帮助你。 请注意,您需要执行树遍历以确定最重要的内容。

仍然存在透明视图的角落案例会给你带来麻烦,但这应该可以让你获得95%的胜利。 我们正在为这个案子找到更好的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM