我正在尝试从 AccessiblityNodeInfo 的所有子节点读取文本。
我尝试获得
AccessiblityNodeInfo.getParent()
和 AccessibilityNodeInfo.getChildCount()
for(int i=0; i<accessibilityNodeInfo.getChildCount();i++){
accessibilityNodeInfo.getChild(i).getText();
}
如上所述访问子节点,从子节点中获取文本。但它没有提供屏幕上的所有文本。
有人可以建议我如何获取短信吗?
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);
}
}
}
}
}
这就是我能够做到的:
在 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 中所有子节点的文本