2016-11-10 56 views
12

Próbuję uzyskać dostęp do zawartości tekstowej innej aplikacji, która prawdopodobnie została zbudowana przy użyciu innej niż macierzysta (js + html) architektury.Jak uzyskać dostęp do treści html AccessibilityNodeInfo elementu WebView za pomocą usługi dostępności w systemie Android?

W związku z tym doszedłem do wniosku, że spróbuję uzyskać dostęp do danych z węzła dostępności odpowiadającego elementowi WebView. Jednak jestem w stanie pobrać dane tekstowe/html za pomocą zwykłych metod od czasu metod, takich jak gettext() działa tylko wtedy, gdy jest native android elementu takiego jak TextView, Button itp

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 ?? 

     } 
    } 
} 

}

Odpowiedz

5

Czy Twoja usługa ma FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY?

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

Android domyślnym AccessibilityService (mową) wymaga tego, aby móc odczytać tekst ekran w WebView s. Z bada źródła, wydaje się, że istnieje jakiś zastrzyk skrypt a niektóre nieco hackiness aby być w stanie uzyskać zawartość tekstową elementów HTML

Należy sprawdzić ich źródło:

TalkBackService

WebInterfaceUtils

ProcessorWebContent