Ich habe ein WebView in meiner App, die eine Seite anzeigt, die mir nicht gehört. Mein gewünschtes Verhalten ist, dass, wenn ein Link vom Benutzer angeklickt wird, die Browser-App des Geräts gestartet wird und die resultierende Seite dort geladen wird. Leider macht diese Seite einige seltsame Dinge, so dass shouldOverrideUrlLoading()
nicht feuert.Erfassen von Seitenumleitungen über JavaScript in Android WebView
Meine versuchte Lösung ist, ein paar Javascript in pushState zu haken und eine Schnittstelle zu verwenden, um Android-Code zum Starten der Browser-App auszuführen.
Hier ist meine Schnittstelle:
public class LaunchExternalBrowserHack {
Context mContext;
LaunchExternalBrowserHack(Context c) {
mContext = c;
}
@JavascriptInterface
public void launchExternalBrowser(String url) {
openUrl(url);
}
}
ich einige Javascript in die Seite in onPageFinished()
Injektion:
public void onPageFinished(WebView view, String url) {
mWebView.loadUrl(javascript);
}
Hier ist mein javascript:
private final String javascript = "javascript:history.pushState = function (state, title, url) { console.log(url); console.log(location.href); Uphoria.launchExternalBrowser(location.origin, url); };";
Und, Natürlich füge ich die Schnittstelle zu WebView
hinzu:
mWebView.addJavascriptInterface(new LaunchExternalBrowserHack(getContext()), "Android");
Das scheint also zu funktionieren. Die Browser-App wird gestartet und die nächste Seite wird geöffnet.
Aber auch das WebView geht voran. Ich möchte das verhindern, aber ich kann keine Möglichkeit finden, die Weiterleitung des WebView zu verhindern, während ich gleichzeitig die Weiterleitungs-URL erfassen und die Browser-App starten kann. Wie ich bereits erwähnt habe, ist shouldOverrideUrlLoading
mit dieser Webseite nicht feuern.
Ideen?
folgende Sie erwähnen kein Ergebnis in 'onReceiveValue (...)' bekommen. Können Sie sehen, ob das Ändern des Javascript in einen Funktionsaufruf funktionieren würde? Wie [diese Antwort] (http://stackoverflow.com/a/19790911/503508) schlägt vor. Insbesondere in diesem Stil: '(function() {return {var1: \" variable1 \ ", var2: \" variable2 \ "};})();' – Knossos