AccessibilityService获取节点报空对象!

我想要根据跳过和关闭,获取有这两个文本的节点,可运行一次就报空对象,刚学的不太懂,我的代码贴在下面了,各位精英们帮我看看,我该怎么写!!

img

private String getNoteText(List<AccessibilityWindowInfo> wInfo) {
    for (String s : bInfo) {  //  String[] bInfo = new String[]{"跳过", "关闭"};
        for (AccessibilityWindowInfo info : wInfo) {
            List<AccessibilityNodeInfo> text = info.getRoot().findAccessibilityNodeInfosByText(s);
            for (AccessibilityNodeInfo n : text) {
                if (String.valueOf(n.getText()).equals(s)) {
                    Log.i(TAG, "getNoteText: " + n.getText());
                    return String.valueOf(n.getText());
                }
            }
        }
    }
    return null;
}

引用 皆我百晓生 小程序回复内容作答:

通过你提供的代码,我看到你在尝试从AccessibilityWindowInfo中获取指定文本的节点。然而,可能出现空对象的原因有很多,我将提供一些可能导致空对象的问题,并给出解决方案:

  1. AccessibilityWindowInfo为空:在使用AccessibilityWindowInfo之前,你需要确保它是有效的。可以在调用getWindows()方法之后,使用if (info != null)进行有效性检查。

  2. 节点为空:在获取节点之前,你需要确保窗口信息的根节点不为空。你可以使用info.getRoot()获取根节点,然后使用if (root != null)进行有效性检查。

  3. 获取文本为空:在使用n.getText()获取节点文本之前,需要确保节点是有效的。你可以在使用节点之前使用if (n != null && n.getText() != null)进行有效性检查。

  4. 文本匹配问题:你使用String.valueOf(n.getText()).equals(s)来比较节点文本和预期的文本是否相等。确保节点的文本不是null,同时将比较操作更改为n.getText().toString().equals(s)

此外,你还可以添加一些日志来进行调试,例如记录节点文本、窗口信息等,以便确定具体出了什么问题。

修正后的代码示例如下:

private String getNoteText(List<AccessibilityWindowInfo> wInfo) {
    for (String s : bInfo) {  //  String[] bInfo = new String[]{"跳过", "关闭"};
        for (AccessibilityWindowInfo info : wInfo) {
            if (info != null) {
                AccessibilityNodeInfo root = info.getRoot();
                if (root != null) {
                    List<AccessibilityNodeInfo> text = root.findAccessibilityNodeInfosByText(s);
                    for (AccessibilityNodeInfo n : text) {
                        if (n != null && n.getText() != null && n.getText().toString().equals(s)) {
                            Log.i(TAG, "getNoteText: " + n.getText());
                            return String.valueOf(n.getText());
                        }
                    }
                }
            }
        }
    }
    return null;
}

希望这些解决方案能够帮助你解决空对象的问题。如果仍然存在问题,请提供更多的上下文和日志,以便我们能够更好地协助你。

【以下回答由 GPT 生成】

对于AccessibilityService获取节点报空对象的问题,我会针对你的代码提出以下几点建议:

  1. 确保在AndroidManifest.xml文件中正确声明了AccessibilityService,并添加了必要的权限。

  2. 确保你在代码中正确获取了AccessibilityWindowInfo列表wInfo,这里可能需要使用getWindows()方法获取当前展示的窗口列表。

  3. 在遍历AccessibilityWindowInfo时,确保获取到了window的getRoot()方法不返回null。如果返回null,说明该窗口不可访问或者没有根节点,你需要跳过这个窗口。

  4. 确保在遍历查找AccessibilityNodeInfo时,获取到了非空的text列表。如果text列表为空,说明没有找到包含指定文本的节点,你需要跳过这个节点。

  5. 在判断节点内容是否和指定文本相等时,不建议使用String.valueOf(n.getText())方法。你可以直接使用n.getText().toString()方法来获取节点内容,并和指定文本进行比较。同时,为了避免空指针异常,在比较之前可以先判断n.getText()是否为null。

下面是修改后的代码示例:

private String getNoteText(List<AccessibilityWindowInfo> wInfo) {
    for (String s : bInfo) {  //  String[] bInfo = new String[]{"跳过", "关闭"};
        for (AccessibilityWindowInfo info : wInfo) {
            AccessibilityNodeInfo rootInfo = info.getRoot();
            if (rootInfo == null) {
                continue; // 跳过没有根节点的窗口
            }
            List<AccessibilityNodeInfo> text = rootInfo.findAccessibilityNodeInfosByText(s);
            if (text.isEmpty()) {
                continue; // 跳过没有指定文本的节点
            }
            for (AccessibilityNodeInfo n : text) {
                CharSequence nodeText = n.getText();
                if (nodeText != null && nodeText.toString().equals(s)) {
                    Log.i(TAG, "getNoteText: " + nodeText);
                    return nodeText.toString();
                }
            }
        }
    }
    return null;
}

请注意,以上代码只是基于你提供的问题和代码进行了修改,但仍然需要根据具体情况进行调整和优化。如果问题仍然存在,请提供更多相关的代码和错误信息以供进一步分析。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

private String getNoteText(List<AccessibilityWindowInfo> wInfo) {
    for (String s : bInfo) {  //  String[] bInfo = new String[]{"跳过", "关闭"};
        for (AccessibilityWindowInfo info : wInfo) {
            AccessibilityNodeInfo rootInfo = info.getRoot();
            if (rootInfo == null) {
                continue; // 跳过没有根节点的窗口
            }
            List<AccessibilityNodeInfo> text = rootInfo.findAccessibilityNodeInfosByText(s);
            if (text.isEmpty()) {
                continue; // 跳过没有指定文本的节点
            }
            for (AccessibilityNodeInfo n : text) {
                CharSequence nodeText = n.getText();
                if (nodeText != null && nodeText.toString().equals(s)) {
                    Log.i(TAG, "getNoteText: " + nodeText);
                    return nodeText.toString();
                }
            }
        }
    }
    return null;
}