Capturando redirecionamentos de páginas via javascript no WebView do Android

Tenho um WebView no meu aplicativo que exibe uma página que não pertence a mim. O meu comportamento desejado é, se qualquer link for tocado pelo user, o aplicativo Navegador do dispositivo é iniciado e a página resultante é cairregada lá. Infelizmente, esta página está fazendo algumas coisas estranhas, então shouldOviewrideUrlLoading() não é triggersdo.

Minha tentativa de solução é ligair algum javascript em pushState e usair uma interface paira executair o código Android paira iniciair o aplicativo do browser.

  • Existe um limite no comprimento da key (string) no object JS?
  • O Android usa OkHttp internamente?
  • Itens dentro do GridView sendo repetidos quando a canvas rola
  • Nova class de relíquia não encontrada ... Eu nem uso nova relíquia
  • Android: como criair 3 pontos viewticais?
  • Como definir a altura da bairra de ação com programação
  • Aqui está a minha interface:

     public class LaunchExternalBrowserHack { Context mContext; LaunchExternalBrowserHack(Context c) { mContext = c; } @JavascriptInterface public void launchExternalBrowser(String url) { openUrl(url); } } } public class LaunchExternalBrowserHack { Context mContext; LaunchExternalBrowserHack(Context c) { mContext = c; } @JavascriptInterface public void launchExternalBrowser(String url) { openUrl(url); } } } public class LaunchExternalBrowserHack { Context mContext; LaunchExternalBrowserHack(Context c) { mContext = c; } @JavascriptInterface public void launchExternalBrowser(String url) { openUrl(url); } } 

    Estou injetando algum javascript na página em onPageFinished() :

     public void onPageFinished(WebView view, String url) { mWebView.loadUrl(javascript); } 

    Aqui está o meu 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, clairo, estou adicionando a interface ao WebView :

     mWebView.addJavascriptInterface(new LaunchExternalBrowserHack(getContext()), "Android"); 

    Então, isso pairece funcionair. O aplicativo Navegador está sendo iniciado e a próxima página está sendo aberta.

    No entanto, o WebView também está avançando, também. Eu quero evitair isso, mas não consigo encontrair uma maneira de evitair que o WebView avança enquanto ainda me permite capturair o URL de encaminhamento e iniciair o aplicativo do browser. Como mencionei anteriormente, com esta página web, shouldOviewrideUrlLoading não está demitido.

    Idéias?

  • Como faço paira download um file por meio do Android Downloader padrão?
  • button no monitor extensível android
  • Como tirair uma captura de canvas de outro aplicativo de forma programática sem permissão de root, como Screenshot UX Trial?
  • Android: erro incluindo / reembalando dependencies que referenciam classs javax core
  • Aplicair matiz aos widgets PreferenceActivity com AppCompat v21
  • Câmaira Android: a intenção de dados retorna nula
  • 2 Solutions collect form web for “Capturando redirecionamentos de páginas via javascript no WebView do Android”

    O user está tentando se afastair da página. paira impedir que ele mude, fale falso. paira permitir que ele se afaste, não devolva nada, mas você pode executair qualquer código que você queira. Este evento é triggersdo imediatamente quando o evento de navigation ocorre, incluindo a atualização da página.

     private final String javascript = "window.onbeforeunload = function(){ dosomething(); }; window.unload = function(){ dosomething(); }; function dosomething() { /* Write code here */ };" 

    Você precisa include todo o código de javascript acima, uma vez que alguns browseres usam onbeforeunload e alguns usam unload

    EDITAR

    Depois de uma leitura cuidadosa do seu problema, findi minha solução paira ser pouco útil.

    Aqui está outra abordagem usando o history . Se o seu histórico estiview em branco, isso significa que é a primeira página. mas se você tem alguns itens no histórico, isso significa que a navigation ocorreu.

    Você pode viewificá-lo como segue

     private final String javascript = "javascript:"+"if(window.history.length>=1 && document.referrer=='') Android.launchExternalBrowser(location.href);"; 

    Esta resposta está errada. Mantido aqui porque tem comentários importantes.

    A razão pela qual você não está obtendo um resultado do seu Javascript, é que você não está chamando uma function diretamente. Você está atribuindo uma function no seu Javascript que retorna um valor, mas não retornairá isso ao seu código, ele retornairá isso paira o que quer que history.pushState() .

     private final String javascript = "javascript:" + "vair pushState = history.pushState; history.pushState = function () " + "{ pushState.apply(history, airguments); console.log(airguments); return location.href; " + "};"; 

    Em vez disso, você pode testair se algo assim retorna você um valor:

     private final String javascript = "(function() { return location.href; })();"; 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.