通过无障碍服务使用 UiAutomation
Using UiAutomation from an accessibility service
我正在为 Android 编写无障碍服务,旨在为身体残障人士提供不同的替代方案来控制设备,例如,使用开关、扫描、头部跟踪等。
目前,为了在应用程序界面上执行实际操作,我们使用辅助功能 API,基本上是 AccessibilityNodeInfo.performAction() 方法。这在大多数情况下工作正常,但我们发现了一些重要的限制:
- 大多数键盘 (IME) 无法正常工作。我们只在 Lollipop (API 22) 上使用 Google 键盘取得了成功,并且不得不使用 AccessibilityService.getWindows()。对于较低的 API 版本,我们不得不开发一个特殊的键盘(无疑不是最佳解决方案)。
- 大部分游戏无法访问。点。他们不导出 AccessibilityNodeInfo 树。
- Web 导航不实用(没有滚动等问题)。
一个解决方案是使用不同的 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 方法。
我正在为 Android 编写无障碍服务,旨在为身体残障人士提供不同的替代方案来控制设备,例如,使用开关、扫描、头部跟踪等。
目前,为了在应用程序界面上执行实际操作,我们使用辅助功能 API,基本上是 AccessibilityNodeInfo.performAction() 方法。这在大多数情况下工作正常,但我们发现了一些重要的限制:
- 大多数键盘 (IME) 无法正常工作。我们只在 Lollipop (API 22) 上使用 Google 键盘取得了成功,并且不得不使用 AccessibilityService.getWindows()。对于较低的 API 版本,我们不得不开发一个特殊的键盘(无疑不是最佳解决方案)。
- 大部分游戏无法访问。点。他们不导出 AccessibilityNodeInfo 树。
- Web 导航不实用(没有滚动等问题)。
一个解决方案是使用不同的 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 方法。