使用辅助功能服务中的UiAutomation

时间:2015-06-19 16:17:44

标签: android accessibility accessibilityservice

我正在为Android编写一个辅助功能服务,旨在为有身体残疾的人提供不同的替代方案来控制设备,例如,使用开关,扫描,头部跟踪等。

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

  • 大多数键盘(IME)都无法正常工作。我们只是在Lollipop(API 22)上使用Google键盘取得了成功,并且必须使用AccessibilityService.getWindows()。对于较低的API版本,我们必须开发一种特殊的键盘(毫无疑问不是最佳解决方案)。
  • 大多数游戏无法访问。点。它们不会导出AccessibilityNodeInfo树。
  • 网页导航不实用(没有滚动,以及其他问题)。

解决方案是使用不同的API来执行操作,似乎android.app.UiAutomation符合目的。根据文档"它还允许注入模拟用户与键盘和触摸设备交互的任意原始输入事件。这就是我要找的;虽然我知道UiAutomation用于测试目的(并且,也许,还没有为生产质量代码做好准备),并且可能在不同设备上的行为可能不同。我也理解,如果任何应用程序可以使用它,这样的API可能be a security hole。但是,考虑到AccessibilityNodeInfo.performAction()提供类似的" power",允许可访问性服务使用UiAutomation似乎是合理的。

所以,我在我的辅助功能服务中尝试了以下内容:

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

但是getUiAutomation()总是返回null。

在辅助功能服务中是否有使用UiAutomation(或类似API)的选项?

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

1 个答案:

答案 0 :(得分:0)

我回答自己的问题。

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