Ho una visualizzazione Web nella mia app che visualizza una pagina che non mi appartiene. Il mio comportamento desiderato è che, se un utente tocca un collegamento, viene avviata l'app Browser del dispositivo e lì viene caricata la pagina risultante. Sfortunatamente, questa pagina sta facendo alcune cose strane, quindi shouldOverrideUrlLoading()
non si attiva.Cattura reindirizzamenti di pagine tramite javascript nella WebView di Android
La mia tentata soluzione è di agganciare alcuni javascript in pushState e utilizzare un'interfaccia per eseguire il codice Android per avviare l'app browser.
Ecco la mia interfaccia:
public class LaunchExternalBrowserHack {
Context mContext;
LaunchExternalBrowserHack(Context c) {
mContext = c;
}
@JavascriptInterface
public void launchExternalBrowser(String url) {
openUrl(url);
}
}
sto iniettando un javascript nella pagina in onPageFinished()
:
public void onPageFinished(WebView view, String url) {
mWebView.loadUrl(javascript);
}
Ecco il mio javascript:
private final String javascript = "javascript:history.pushState = function (state, title, url) { console.log(url); console.log(location.href); Uphoria.launchExternalBrowser(location.origin, url); };";
E, Ovviamente, aggiungo l'interfaccia allo WebView
:
mWebView.addJavascriptInterface(new LaunchExternalBrowserHack(getContext()), "Android");
Quindi questo sembra funzionare. L'app Browser sta per essere avviata e la pagina successiva si sta aprendo.
Tuttavia, anche la visualizzazione Web si sta spostando in avanti. Voglio evitare questo, ma non riesco a trovare un modo per impedire che il WebView si muova mentre mi consente comunque di catturare l'url di inoltro e avviare l'app Browser. Come accennato in precedenza, con questa pagina Web, shouldOverrideUrlLoading
è non.
Idee?
Non parlare di ottenere un risultato in 'onReceiveValue (...)'. Riesci a vedere se la modifica del javascript in una chiamata di funzione potrebbe funzionare? Come [questa risposta] (http://stackoverflow.com/a/19790911/503508) suggerisce. Nello specifico, in questo stile: '(function() {return {var1: \" variable1 \ ", var2: \" variable2 \ "};})();' – Knossos