Android 在AccessibilityService中遍历AccessibilityNodeInfos

Android 在AccessibilityService中遍历AccessibilityNodeInfos,android,accessibility,accessibilityservice,android-accessibility,Android,Accessibility,Accessibilityservice,Android Accessibility,我当前使用getRootInActiveWindow()检索活动窗口的根节点。然后,我执行广度优先搜索以获得所有节点的列表 我的问题是: 如何遍历此节点列表以获得焦点顺序?此列表是否已根据节点的焦点顺序排序?是否有不同的方法检索焦点顺序 提前感谢。最终,不可以。您不能这样做,关于这一点的可访问性api文档非常误导 有人可能会认为AccessibilityNodeInfo的“focusSearch(int-direction)”功能将是一个不错的选择。但是,最终它被破坏了,如果你回到Android

我当前使用
getRootInActiveWindow()
检索活动窗口的根节点。然后,我执行广度优先搜索以获得所有节点的列表

我的问题是: 如何遍历此节点列表以获得焦点顺序?此列表是否已根据节点的焦点顺序排序?是否有不同的方法检索焦点顺序


提前感谢。

最终,不可以。您不能这样做,关于这一点的可访问性api文档非常误导

有人可能会认为AccessibilityNodeInfo的“focusSearch(int-direction)”功能将是一个不错的选择。但是,最终它被破坏了,如果你回到Android可访问性API的INARD,你最终会发现一个函数,它被记录为:

在指定方向上搜索可以获取输入焦点的最近视图

酷,这正是我们想要的,对吗?等一下。此函数调用一个函数

AccessibilityInteractionClient.getInstance().focusSearch(mConnectionId, mWindowId, mSourceNodeId, direction);
该功能的文件记录如下:

查找以可访问性为中心的{@link android.view.accessibility.AccessibilityNodeInfo}。搜索在指定id的窗口中执行,并从指定可访问性id的节点开始

令人遗憾的是,您还将发现此函数对这些作业(定向焦点搜索或定向辅助功能焦点搜索)都不起作用

最终,当TalkBack中的某个元素由于某个元素的焦点而获得可访问性焦点时,它实际上是响应来自操作系统的实际焦点事件,而不是TalkBack对输入焦点排序所做的任何计算

为了做到这一点,您基本上必须实现操作系统中的整个逻辑,以便自己进行选项卡排序,系统本身所需的信息较少,因为系统有真正的
android.widget.View
对象要处理,而不是假
AccessibilityNodeInfo
对象,信息有限。你能想到的任何方法都是非常脆弱的,并且不能保证与系统的实际功能一致

您倾向于尝试广度优先遍历“输入可聚焦”(
AccessibilityNodeInfo
focusable
属性)是一个相当合理的解决方案。问题将是,真正的系统选项卡排序将是其中的一个子集,它忽略了不同窗口上存在的元素等内容

说真的,打开对讲设置屏幕,打开对讲,连接硬件键盘,疯狂地按tab键和shift键,然后惊奇地发现你怎么不能将焦点放在“设置”按钮上。您的遍历函数可能会出错,因为“设置”按钮是可聚焦的,但不知何故,您无法将焦点放在那里。我将省略一些严重的AOSP胡说八道的原因,不,我不确定AccessibilityServices是否可以获得在您的理论算法中避免出现这种情况的信息

总而言之,宽度优先遍历在理论上是可行的,但是将会有大量的角落案例,不,我不确定AccessibilityServices是否可以使用正确处理每个角落案例的信息。另外,值得注意的是,由于这个特殊问题,如果您希望解决方案在4.4、5.0和7.0+设备上都是正确的,那么对于不同的操作系统版本,您必须有不同的计算变体。是的,那些角落里的案子会不一样的!(笑声)


我真诚的推荐。。。放弃。

你是说焦点顺序,还是说可访问性焦点顺序?我说的是输入焦点。请参阅“焦点顺序”: