5

我正在为 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)?

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

4

1 回答 1

1

我回答我自己的问题。

从 Nougat (API 24) 开始,以编程方式在其他应用程序上执行操作的方法是使用辅助功能服务和AccessibilityService#dispatchGesture方法。

于 2018-08-06T11:30:59.637 回答