Die Android WebKit Implementierung ermöglicht es dem Entwickler eine WebView durch die android.webkit.WebSettings Klasse wie
- Unterstützung für JavaScript zu ändern,
- Unterstützung für Plugins,
- Dateisystemzugriff,
- Ressourcen Inspection etc.
In Ressourceninspektion, es ist möglich, die Anforderungen für Inhalt und/oder Ressourcen durch Überschreiben shouldOverrideUrlLoading und sophInterceptRequest Methoden zu überprüfen.
Aber vor zwei Methoden sind die Verwendung für verschiedene Zwecke wie
1. shouldOverrideUrlLoading
aufgerufen wird, wenn eine neue Seite im Begriff ist, während shouldInterceptRequest
geöffnet werden soll, wird jedes Mal, wenn eine Ressource wie eine CSS-Datei geladen wird aufgerufen, ein js Datei usw.
2.Wenn ein Benutzer interaktiv eine Ressource von einem WebView anfordert, ist es möglich, durch die Verwendung der shouldOverrideUrlLoading
-Methode der Klasse WebViewClient
die Anfrage abzufangen. Beispielcode ist unten dargestellt. Source
private class MyWebViewClient extends WebViewClient {
@Override public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (Uri.parse(url).getHost().equals("www.google.com")) {
return true;
}
return false;
}
}
Das Verfahren gibt der Host-Anwendung eine Chance, die Kontrolle zu übernehmen, wenn eine neue URL über im aktuellen WebView geladen werden. Ein Rückgabewert von true bedeutet, dass die Host-Anwendung die URL behandelt, während return false bedeutet, dass das aktuelle WebView die URL behandelt. Der obige Code verhindert, dass Ressourcen vom Host "www.google.com" geladen werden.
Die Methode fängt jedoch das Laden von Ressourcen nicht von innen ab, z. B. von einem IFRAME- oder src-Attribut innerhalb eines HTML- oder SCRIPT-Tags. Außerdem würden XmlHttpRequests auch nicht abgefangen. Um diese Anfragen abzufangen, können Sie die Methode WebViewClient shouldInterceptRequest
verwenden. Beispielcode ist unten dargestellt.
@Override
public WebResourceResponse shouldInterceptRequest(final WebView view, String url) {
if (url.contains(".js")) {
return getWebResourceResponseFromString();
} else {
return super.shouldInterceptRequest(view, url);
}
}
private WebResourceResponse getWebResourceResponseFromString() {
return getUtf8EncodedWebResourceResponse(new StringBufferInputStream("alert('!NO!')"));
}
private WebResourceResponse getUtf8EncodedWebResourceResponse(InputStream data) {
return new WebResourceResponse("text/javascript", "UTF-8", data);
}
Das Verfahren teilt die Host-Anwendung von einer Ressourcen-Anforderung und erlaubt die Anwendung die Daten zurückzukehren. Wenn der Rückgabewert null ist, lädt das WebView die Ressource weiterhin wie gewohnt. Andernfalls werden die Antwortantwort und die Daten verwendet. Der obige Code fängt Anfragen nach JavaScript-Ressourcen (.js) ab und gibt eine Warnung anstelle der angeforderten Ressource zurück.
Mehr unter: WebViewClient shouldOverrideUrlLoading und shouldInterceptRequest
Offenbar shouldOverrideUrlLoading() nicht aufgerufen werden, wenn die loadURL zum ersten genannt wird. Entgegen der landläufigen Meinung wird shouldOverrideUrlLoading() aufgerufen, wenn von der bereits geladenen Webseite auf einen internen Link geklickt wird. – AnupamChugh