【问题标题】:Finding the coordinates of a button or text on the screen using the accessibility service使用无障碍服务在屏幕上查找按钮或文本的坐标
【发布时间】:2022-06-23 06:13:46
【问题描述】:

是否可以使用无障碍服务来查找按钮的坐标或屏幕上的文本,然后模拟点击该按钮或文本字段,但无需触摸该字段,就像您需要在 Android 中触摸该字段一样TalkBack 以收听阅读?

例如,是否可以像这样使用无障碍服务:

  1. 将意图从 Activity 发送到无障碍服务,并为不同的任务添加一些额外内容。

  2. 当接收到带有特定额外字符串的意图时,服务将打开开发者选项。

  3. 在不触摸“正在运行的服务”文本的情况下,无障碍服务应该在开发者选项中找到该文本字段(或按钮)坐标并模拟点击它。

这在 Android 上是否可行?

【问题讨论】:

    标签: android service textview accessibility coordinates


    【解决方案1】:

    TL;DR;我想我写了一个service you might find interesting

    需要记住的几点:

    1. 您需要启用该服务并使其运行。
    2. Google 已禁止在 Play Store 上发布无障碍服务,如果它们是not intended for helping people with disabilities
    3. 辅助功能服务只能“看到”当前屏幕上的内容 - 这是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)
    

    【讨论】:

      猜你喜欢
      • 2020-11-28
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 2014-08-19
      • 2021-07-15
      • 2022-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多