Android WebView, como lidar com redirecionamentos no aplicativo em vez de abrir um navegador

120

Portanto, agora no meu aplicativo, a URL que estou acessando tem um redirecionamento e, quando isso acontecer, o WebView abrirá um novo navegador, em vez de permanecer no meu aplicativo. Existe uma maneira de alterar as configurações para que o modo de exibição redirecione para o URL normalmente, mas permaneça no meu aplicativo em vez de abrir um novo navegador?

Editar:

Quero o URL de redirecionamento, só não sei como criá-lo, então a única maneira de chegar a esse URL é por meio de um que causará um redirecionamento para o que desejo.

Por exemplo: Quando você vai aqui: http://www.amazon.com/gp/aw/s/ref=is_box_/k=9780735622777 observe como ele redirecionará o URL para o produto real. No meu aplicativo, se eu abri-lo em um novo navegador, isso funcionará perfeitamente; no entanto, se eu mantê-lo no meu aplicativo com um WebView, ele aparecerá como se estivesse fazendo uma pesquisa por k = 9780735622777, assim: http://www.amazon.com/gp/aw/s/ref=is_s_?k=k%3D9780735622777&x=0&y=0 . OU, ele abrirá a visualização no navegador e mostrará o que é apropriado. No entanto, quero manter tudo em meu aplicativo.

James
fonte

Respostas:

253

Crie um WebViewClient e substitua o método shouldOverrideUrlLoading .

webview.setWebViewClient(new WebViewClient() {
    public boolean shouldOverrideUrlLoading(WebView view, String url){
        // do your handling codes here, which url is the requested url
        // probably you need to open that url rather than redirect:
        view.loadUrl(url);
        return false; // then it is not handled by default action
   }
});
xandy
fonte
8
Eu adoro respostas como method () {// coloque aqui o código que você não sabe como usar}
JMRboosties
19
Por favor, não replique o código acima. Retorne false do retorno de chamada em vez de chamar view.loadUrl. Chamar loadUrl introduz um bug sutil em que, se você tiver algum iframe na página com um URL de esquema personalizado (digamos <iframe src = "tel: 123" />), ele irá navegar pelo frame principal do seu aplicativo para esse URL, provavelmente quebrando o aplicativo como um efeito colateral.
marcin.kosiba
@ marcin.kosiba depende de como é usado, para meu caso de uso o que você descreve não é um problema, mas ainda assim agradeço o
aviso
@Warpzit - claro, se você carregar apenas conteúdo confiável no webview e tiver 100% de garantia de que ninguém pode explorar essa falha, tudo bem. OTOH por que correr o risco?
marcin.kosiba
1
Como posso saber se o url que chamou o shouldOverrideUrlLoadingmétodo é o próximo url de redirecionamento? E eu quero permitir isso?
Phan Sinh
21

De acordo com a documentação oficial , um clique em qualquer link do WebView inicia um aplicativo que manipula URLs, que por padrão é um navegador. Você precisa substituir o comportamento padrão como este

    myWebView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }
    });
abbas
fonte
8
Melhor ainda, basta chamar myWebView.setWebViewClient (new WebViewClient ()); A implementação padrão de shouldOverrideUrlLoading retorna falso.
cyroxis
14

Basta adicionar um personalizado padrão WebViewClient. Isso faz com que o WebView manipule qualquer URL carregado.

mWebView.setWebViewClient(new WebViewClient());
Até
fonte
8

Você terá que definir seu WebviewClient personalizado substituindo o método shouldOverrideUrlLoading para seu webview antes de carregar o url.

mWebView.setWebViewClient(new WebViewClient()
        {
            @SuppressWarnings("deprecation")
            @Override
            public boolean shouldOverrideUrlLoading(WebView webView, String url)
            {
                return shouldOverrideUrlLoading(url);
            }

            @TargetApi(Build.VERSION_CODES.N)
            @Override
            public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest request)
            {
                Uri uri = request.getUrl();
                return shouldOverrideUrlLoading(uri.toString());
            }

            private boolean shouldOverrideUrlLoading(final String url)
            {
                Log.i(TAG, "shouldOverrideUrlLoading() URL : " + url);

                // Here put your code

                return true; // Returning True means that application wants to leave the current WebView and handle the url itself, otherwise return false.
            }
        });

Verifique o código de exemplo para lidar com redirecionar urls e abrir PDF sem download, em webview. https://gist.github.com/ashishdas09/014a408f9f37504eb2608d98abf49500

Ashish Das
fonte
Observe que o link acima para um código de exemplo não existe.
Jetdog
Eu carreguei o link.
Ashish Das
Funcionou para mim Obrigado @AshishDas +10
livemaker
2

Por favor, use o código kotlin abaixo

webview.setWebViewClient(object : WebViewClient() {
            override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {   
                view.loadUrl(url)
                return false 
            }
        })

Para mais informações clique aqui

Shalu TD
fonte
2

Crie uma classe que implemente webviewclient e adicione o código a seguir que permite substituir a string url conforme mostrado abaixo. Você pode ver estes [exemplo] [1]

public class myWebClient extends WebViewClient {

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
         view.loadUrl(url); 
         return true;
     }
}

No seu construtor, crie um objeto webview conforme mostrado abaixo.

   web = new WebView(this); web.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 

Em seguida, adicione o seguinte código para executar o carregamento de urls dentro do seu aplicativo

       WebSettings settings=web.getSettings(); 
    settings.setJavaScriptEnabled(true); 
    
    web.loadUrl("http://www.facebook.com");
    web.setWebViewClient(new myWebClient()); 
   
 web.setWebChromeClient(new WebChromeClient() {
      // 
      //
    }
Daniel Nyamasyo
fonte
0
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
    super.onPageStarted(view, url, favicon);
    if (url.equals("your url")) {
        
            Intent intent = new Intent(view.getContext(), TransferAllDoneActivity.class);
            startActivity(intent);
        
    }
}
Rasul Mammadov
fonte
Olá, bem-vindo, gostaria de explicar seu código e nos mostrar por que essa é a resposta certa?
Ali