如何使用Android中的辅助功能服务访问WebView元素的AccessibilityNodeInfo的html内容?

Uma*_*hur 15 android accessibility webview

我正在尝试访问另一个应用程序的文本内容,该应用程序可能是使用非本机(基于js + html)的框架构建的.

因此,我想我将尝试从对应于WebView元素的辅助功能节点访问数据.但是,我无法使用常用方法获取textual/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's AccessibilityNodeInfo !!!!
            //===========How to get HTML data from nodeinfo object here ??

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

}

Hyp*_*cle 9

您的服务是否有FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY

final AccessibilityServiceInfo info = getServiceInfo();
info.flags |= AccessibilityServiceInfo.FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY;
setServiceInfo(info);
Run Code Online (Sandbox Code Playgroud)

Android的默认AccessibilityService(TalkBack)要求它能够屏幕阅读WebViews中的文本.从检查源代码来看,似乎有一些脚本注入和一些轻微的hackiness,以便能够获取HTML元素的文本内容

你应该查看他们的来源:

TalkBackService

WebInterfaceUtils

ProcessorWebContent