从辅助功能服务使用UiAutomation

塞萨尔·毛里(Cesar Mauri)

我正在为Android编写一项辅助功能服务,旨在为身体残障人士提供不同的选择来控制设备,例如使用开关,扫描,头部跟踪等。

当前,为了在应用程序界面上执行实际操作,我们使用了可访问性API,基本上是AccessibilityNodeInfo.performAction()方法。在大多数情况下,这种方法都能正常工作,但是我们发现了一些重要的限制:

  • 大多数键盘(IME)不能正常工作。我们仅在Lollipop(API 22)上使用Google键盘获得了成功,并且不得不使用AccessibilityService.getWindows()对于较低的API版本,我们必须开发一个特殊的键盘(无疑不是最佳解决方案)。
  • 大多数游戏都不可用。点。它们不导出AccessibilityNodeInfo树。
  • 网络导航是不切实际的(除其他问题外,没有滚动)。

一种解决方案是使用其他API来执行操作,而android.app.UiAutomation似乎可以满足要求。根据文档,“这还允许注入任意原始输入事件,以模拟用户与键盘和触摸设备的交互”。尽管我了解UiAutomation仅用于测试目的(并且可能尚未准备好生产质量代码),并且在不同设备上的表现可能不同。我也了解,如果任何应用程序可以使用此API,那么它可能是一个安全漏洞但是,鉴于AccessibilityNodeInfo.performAction()提供类似的“功能”,允许无障碍服务使用UiAutomation似乎是合理的。

因此,我在无障碍服务中尝试了以下操作:

 Instrumentation i = new Instrumentation();
 UiAutomation automation = i.getUiAutomation();

但是getUiAutomation()始终返回null。

辅助功能服务中是否可以使用UiAutomation(或类似的API)?

顺便说一句:植根设备不是我们的选择,因此我们无法通过屏幕驱动程序注入事件

塞萨尔·毛里(Cesar Mauri)

我回答我自己的问题。

从Nougat(API 24)开始,以编程方式对其他应用程序执行操作的方法是使用可访问性服务和AccessibilityService#dispatchGesture方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章