Как получить доступ к html-контенту AccessibilityNodeInfo элемента WebView с помощью Accessibility Service в Android?

Я пытаюсь получить доступ к текстовому контенту другого приложения, которое, вероятно, построено с использованием не-родной (js + html) структуры.

Следовательно, я решил, что попытаюсь получить доступ к данным из доступности node, соответствующего элементу WebView. Тем не менее, я не могу захватить текстовые/html-данные с помощью обычных методов, поскольку методы, подобные getText(), работают только в том случае, если это собственный элемент Android, такой как TextView, Button и т.д.

public class MyAccessibilityService extends AccessibilityService {

@Override
public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
    AccessibilityNodeInfo accessibilityNodeInfo = accessibilityEvent.getSource();
    if (accessibilityNodeInfo == null) {
        return;
    }
    int childCount = accessibilityNodeInfo.getChildCount();
    for (int i = 0; i < childCount; i++) {
        AccessibilityNodeInfo accessibilityNodeInfoChild = accessibilityNodeInfo.getChild(i);
        myRecursiveFunc(accessibilityNodeInfoChild);
    }
}

@Override
public void onInterrupt() {

}


private void myRecursiveFunc(AccessibilityNodeInfo accessibilityNodeInfoChild) {
    if (accessibilityNodeInfoChild.getChildCount() > 0) {
        for (int j = 0; j < accessibilityNodeInfoChild.getChildCount(); j++) {
            AccessibilityNodeInfo child = accessibilityNodeInfoChild.getChild(j);
            if (child != null) {
                myRecursiveFunc(child);
            }
        }
    } else {
        if ("android.webkit.WebView".equals(accessibilityNodeInfoChild.getClassName())) {

            //===========This is a WebView AccessibilityNodeInfo !!!!
            //===========How to get HTML data from nodeinfo object here ??

        }
    }
}

}

Ответ 1

Есть ли у вашей службы FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY?

final AccessibilityServiceInfo info = getServiceInfo();
info.flags |= AccessibilityServiceInfo.FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY;
setServiceInfo(info);

Android default AccessibilityService (TalkBack) требует, чтобы это позволяло читать текст в WebView s. Исследуя источник, кажется, что есть некоторая инъекция script и небольшая взлома, чтобы иметь возможность получать текстовое содержимое элементов HTML

Вы должны проверить свой источник:

TalkBackService

WebInterfaceUtils

ProcessorWebContent