如何从AccessibilityNodeInfo中的所有子节点获取文本

问题描述 投票:0回答:2

我正在尝试从 AccessiblityNodeInfo 的所有子节点读取文本。

我尝试获得

AccessiblityNodeInfo.getParent()
AccessibilityNodeInfo.getChildCount()

for(int i=0; i<accessibilityNodeInfo.getChildCount();i++){
accessibilityNodeInfo.getChild(i).getText();
}

如上所述访问子节点,从子节点中获取文本。但它没有提供屏幕上的所有文本。

有人可以建议我如何获取短信吗?

java android accessibilityservice accessibility accessibility-api
2个回答
1
投票
private List<CharSequence> getAllChildNodeText(AccessibilityNodeInfoCompat infoCompat) {
    List<CharSequence> contents = new ArrayList<>();
    if (infoCompat == null)
        return contents;
    if (infoCompat.getContentDescription() != null) {
        contents.add(infoCompat.getContentDescription().toString().isEmpty() ? "unlabelled" : infoCompat.getContentDescription());
    } else if (infoCompat.getText() != null) {
        contents.add(infoCompat.getText().toString().isEmpty() ? "unlabelled" : infoCompat.getText());
    } else {
        getTextInChildren(infoCompat, contents);
    }
    if (infoCompat.isClickable()) {
        if (infoCompat.getClassName().toString().contains(Button.class.getSimpleName())) {
            if (contents.size() == 0) {
                contents.add("Unlabelled button");
            } else {
                contents.add("button");
            }
        }
        contents.add("Double tap to activate");
    }
    return contents;
}


private void getTextInChildren(AccessibilityNodeInfoCompat nodeInfoCompat, List<CharSequence> contents) {
    if (nodeInfoCompat == null)
        return;
    if (!nodeInfoCompat.isScrollable()) {
        if (nodeInfoCompat.getContentDescription() != null) {
            contents.add(nodeInfoCompat.getContentDescription());
        } else if (nodeInfoCompat.getText() != null) {
            contents.add(nodeInfoCompat.getText());
        }
        if (nodeInfoCompat.getChildCount() > 0) {
            for (int i = 0; i < nodeInfoCompat.getChildCount(); i++) {
                if (nodeInfoCompat.getChild(i) != null) {
                    getTextInChildren(nodeInfoCompat.getChild(i), contents);
                }
            }
        }
    }
}

0
投票

这就是我能够做到的:

在 onServiceConnected 中的 MyAccessibilityService 类中:

 @Override
protected void onServiceConnected() {
    super.onServiceConnected();

    AccessibilityServiceInfo info = new AccessibilityServiceInfo();
    info.eventTypes =
            AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED |
                    AccessibilityEvent.TYPE_VIEW_FOCUSED |
                    AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
    info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;

    this.setServiceInfo(info);
    Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show();
}

然后在 onAccessibilityEvent 中我这样写:

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {



    AccessibilityNodeInfo source = event.getSource();
    if (source == null) {
        return;
    }

    try {
        if (count(source.getChildCount()) != null) {
            String words = "";
            getChild(source);
        }

    } catch (Exception e) {
        e.printStackTrace();
    }


}

主要函数是 getChild():

    private void getChild(AccessibilityNodeInfo accessibilityNodeInfo) {
    AccessibilityNodeInfo accessibilityNodeInfo1;
    int c = accessibilityNodeInfo.getChildCount();
    for (int i = 0; i < c; i++) {
        accessibilityNodeInfo1 = accessibilityNodeInfo.getChild(i);
        getChild(accessibilityNodeInfo1);
        if (accessibilityNodeInfo1.getText() != null) {
            words += accessibilityNodeInfo1.getText() + " ";
            Log.d("MYTAG", "getText: " + accessibilityNodeInfo1.getText());
            Log.d("MYTAG", "getChild: --------------------------------------------------");

        }
    }
}

现在您拥有来自 AccessibilityNodeInfo 中所有子节点的文本

© www.soinside.com 2019 - 2024. All rights reserved.