Android WebView, cómo manejar las redirecciones en la aplicación en lugar de abrir un navegador

120

Entonces, ahora mismo en mi aplicación, la URL a la que estoy accediendo tiene una redirección, y cuando esto sucede, WebView abrirá un nuevo navegador, en lugar de permanecer en mi aplicación. ¿Hay alguna forma de que pueda cambiar la configuración para que la Vista se redirija a la URL como de costumbre, pero permanezca en mi aplicación en lugar de abrir un nuevo navegador?

Editar:

Quiero la URL de redireccionamiento, pero no sé cómo crearla, por lo que la única forma de llegar a esa URL es a través de una que provocará una redirección a la que quiero.

Por ejemplo: cuando vaya aquí: http://www.amazon.com/gp/aw/s/ref=is_box_/k=9780735622777 observe cómo redirigirá la URL al producto real. En mi aplicación, si la abro en un nuevo navegador, funcionará bien, sin embargo, si la mantengo en mi aplicación con WebView, aparecerá como si estuviera haciendo una búsqueda de k = 9780735622777, así: http://www.amazon.com/gp/aw/s/ref=is_s_?k=k%3D9780735622777&x=0&y=0 . O, abrirá la vista en el navegador y mostrará lo que es apropiado. Sin embargo, quiero mantener todo en mi aplicación.

James
fuente

Respuestas:

253

Cree un WebViewClient y anule el 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
   }
});
X y Y
fuente
8
Me encantan las respuestas que son como el método () {// simplemente ponga el código que no sabe cómo usar aquí}
JMRboosties
19
No repita el código anterior. Devuelve falso de la devolución de llamada en lugar de llamar a view.loadUrl. Llamar a loadUrl introduce un error sutil en el que, si tiene un iframe dentro de la página con una URL de esquema personalizado (por ejemplo, <iframe src = "tel: 123" />), navegará por el marco principal de su aplicación a esa URL, lo más probable es que rompa la aplicación como un efecto secundario.
marcin.kosiba
@ marcin.kosiba depende de cómo se use, para mi caso de uso, lo que describe no es un problema, pero aún aprecio el
aviso
@Warpzit: claro, si solo carga contenido confiable en la vista web y tiene una garantía del 100% de que nadie puede explotar ese error, está bien. OTOH ¿por qué correr el riesgo?
marcin.kosiba
1
¿Cómo puedo saber que la URL que llamó al shouldOverrideUrlLoadingmétodo es la siguiente URL de redireccionamiento? ¿Y quiero permitirlo?
Phan Sinh
21

Según la documentación oficial , un clic en cualquier enlace en WebView lanza una aplicación que maneja las URL, que por defecto es un navegador. Necesita anular el comportamiento predeterminado como este

    myWebView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }
    });
abbas
fuente
8
Aún mejor, simplemente llame a myWebView.setWebViewClient (new WebViewClient ()); La implementación predeterminada de shouldOverrideUrlLoading devuelve falso.
cyroxis
14

Bastará con añadir una personalizada predeterminada WebViewClient. Esto hace que WebView maneje cualquier URL cargada por sí mismo.

mWebView.setWebViewClient(new WebViewClient());
Hasta que
fuente
8

Tendrá que configurar su método de anulación de WebviewClient personalizado shouldOverrideUrlLoading para su vista web antes de cargar la 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.
            }
        });

Consulte el código de ejemplo para manejar URL de redireccionamiento y abrir PDF sin descargar, en vista web. https://gist.github.com/ashishdas09/014a408f9f37504eb2608d98abf49500

Ashish Das
fuente
Tenga en cuenta que el enlace anterior para un código de ejemplo no existe.
Jetdog
he subido el enlace.
Ashish Das
Trabajó para mí Gracias @AshishDas +10
livemaker
2

Utilice el siguiente código kotlin

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

Para más información haga clic aquí

Shalu TD
fuente
2

Cree una clase que implemente webviewclient y agregue el siguiente código que permite omitir la cadena de URL como se muestra a continuación. Puedes ver estos [ejemplo] [1]

public class myWebClient extends WebViewClient {

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

En su constructor, cree un objeto webview como se muestra a continuación.

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

Luego agregue el siguiente código para realizar la carga de URL dentro de su aplicación

       WebSettings settings=web.getSettings(); 
    settings.setJavaScriptEnabled(true); 
    
    web.loadUrl("http://www.facebook.com");
    web.setWebViewClient(new myWebClient()); 
   
 web.setWebChromeClient(new WebChromeClient() {
      // 
      //
    }
Daniel Nyamasyo
fuente
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
fuente
Hola, bienvenido, ¿te gustaría explicarnos tu código y mostrarnos por qué es la respuesta correcta?
Ali