【问题标题】:Finding the coordinates of a button or text on the screen using the accessibility service使用无障碍服务在屏幕上查找按钮或文本的坐标
【发布时间】:2022-06-23 06:13:46
【问题描述】:
是否可以使用无障碍服务来查找按钮的坐标或屏幕上的文本,然后模拟点击该按钮或文本字段,但无需触摸该字段,就像您需要在 Android 中触摸该字段一样TalkBack 以收听阅读?
例如,是否可以像这样使用无障碍服务:
-
将意图从 Activity 发送到无障碍服务,并为不同的任务添加一些额外内容。
-
当接收到带有特定额外字符串的意图时,服务将打开开发者选项。
-
在不触摸“正在运行的服务”文本的情况下,无障碍服务应该在开发者选项中找到该文本字段(或按钮)坐标并模拟点击它。
这在 Android 上是否可行?
【问题讨论】:
标签:
android
service
textview
accessibility
coordinates
【解决方案1】:
TL;DR;我想我写了一个service you might find interesting
需要记住的几点:
- 您需要启用该服务并使其运行。
- Google 已禁止在 Play Store 上发布无障碍服务,如果它们是not intended for helping people with disabilities
- 辅助功能服务只能“看到”当前屏幕上的内容 - 这是
RecyclerViews 的问题,因为ViewHolder 在用户滚动时被重复用于不同的元素。
但是您可以在无障碍服务中执行此操作:
// To find a node by *fully qualified id*
rootInActiveWindow.findAccessibilityNodeInfosByViewId("id criteria")
// To find a node by text criteria
rootInActiveWindow.findAccessibilityNodeInfosByText("text criteria")
通过id criteria搜索时:
通过完全限定视图 id 的资源名称查找 AccessibilityNodeInfos,其中完全限定 id 来自“package:id/id_resource_name”。例如,如果目标应用程序的包是“foo.bar”,id 资源名称是“baz”,则完全限定的资源 id 是“foo.bar:id/baz”。
注意:主此 API 用于 UI 测试自动化,如果 AccessibilityNodeInfo 客户端必须在配置 AccessibilityService 时设置 AccessibilityServiceInfo#FLAG_REPORT_VIEW_IDS 标志,则报告完全限定的视图 ID。
通过text criteria搜索时:
通过文本查找 AccessibilityNodeInfos。匹配是不区分大小写的包含。搜索与此信息相关,即此信息是遍历树的根。
两者的注意事项:
注意:如果此视图层次结构具有通过 SurfaceView#setChildSurfacePackage 嵌入另一个视图层次结构的 SurfaceView,则存在此 API 无法在嵌入式视图层次结构上找到视图节点的限制。这是因为视图不知道嵌入的层次结构。相反,您可以遍历所有子节点来查找节点。
点击一个元素:
fun click(long: Boolean = false) {
someAccessibilityNodeInfoObject.performAction(
if (long) ACTION_LONG_CLICK
else ACTION_CLICK
)
}
如果您真的热衷于获取节点的屏幕坐标,您可以随时使用getBoundsInScreen 方法,但是您必须完成所有数学运算和其他工作,这比实际需要的要难。 But I did it in bash 在执行 adb uiautomator dump 并解析 XML、剥离我想要的节点的边界时,请注意使用 uiautomator dump 会禁用可访问性服务。
MIDX= START_X + ((END_X - START_X) / 2)
MIDY= START_Y + ((END_Y - START_Y) / 2)