我正在为 Android 编写一个无障碍服务,旨在为身体残疾的人提供不同的选择来控制设备,例如,使用开关、扫描、头部跟踪等。
目前,为了在应用程序的界面上执行实际操作,我们使用可访问性 API,基本上是 AccessibilityNodeInfo.performAction() 方法。这在大多数情况下都可以正常工作,但我们发现了一些重要的限制:
- 大多数键盘 (IME) 都不起作用。我们只在 Lollipop (API 22) 上使用 Google 键盘取得了成功,并且不得不使用AccessibilityService.getWindows()。对于较低的 API 版本,我们必须开发一个特殊的键盘(无疑不是最佳解决方案)。
- 大多数游戏无法访问。点。它们不导出 AccessibilityNodeInfo 树。
- Web 导航不实用(除其他问题外,没有滚动)。
一个解决方案是使用不同的 API 来执行操作,而且 android.app.UiAutomation 似乎适合这个目的。根据我正在寻找的文档“它还允许注入模拟用户与键盘和触摸设备交互的任意原始输入事件”;尽管我知道 UiAutomation 旨在用于测试目的(并且可能还没有准备好用于生产质量代码),并且可能在不同设备上的行为可能不同。我也明白,如果任何应用程序都可以使用这样的 API,它可能是一个安全漏洞。但是,鉴于 AccessibilityNodeInfo.performAction() 提供了类似的“权力”,允许无障碍服务使用 UiAutomation 似乎是合理的。
因此,我在辅助功能服务中尝试了以下操作:
Instrumentation i = new Instrumentation();
UiAutomation automation = i.getUiAutomation();
但是 getUiAutomation() 总是返回 null。
是否有任何选项可以在辅助功能服务中使用 UiAutomation(或类似 API)?
顺便说一句:生根设备不是我们的选择,因此我们无法通过屏幕驱动程序注入事件