通过无障碍服务使用 UiAutomation

Using UiAutomation from an accessibility service

我正在为 Android 编写无障碍服务,旨在为身体残障人士提供不同的替代方案来控制设备,例如,使用开关、扫描、头部跟踪等。

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

一个解决方案是使用不同的 API 来执行操作,android.app.UiAutomation 似乎符合目的。根据文档 "It also allows injecting of arbitrary raw input events simulating user interaction with keyboards and touch devices",这正是我要找的;尽管我知道 UiAutomation 旨在用于测试目的(并且可能还没有为生产质量代码做好准备)并且也许在不同设备上的行为可能不同。我也明白,如果任何应用程序可以使用它,这样的 API 可能 be a security hole。但允许无障碍服务使用 UiAutomation 似乎是合理的,因为 AccessibilityNodeInfo.performAction() 提供了类似的 "powers"。

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

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

但是 getUiAutomation() 总是 returns null。

是否可以选择在无障碍服务中使用 UiAutomation(或类似 API)?

顺便说一句:root 设备不是我们的选择,所以我们不能 inject events through the screen driver

我回答我自己的问题。

自 Nougat (API 24) 以来,以编程方式对其他应用程序执行操作的方法是使用无障碍服务和 AccessibilityService#dispatchGesture 方法。