Saltar al contenido

Cómo obtener la URL del enlace en Android WebView con HitTestResult para una imagen vinculada (y no la URL de la imagen) con Longclick

Hacemos una verificación profunda cada uno de los posts de nuestro espacio con el objetivo de mostrarte en todo momento la información veraz y actual.

Ninguna de las soluciones anteriores funcionó para mí en Android 4.2.2. Así que investigué el código fuente del navegador web predeterminado de Android. Extraje la solución a este problema exacto: obtenga la URL del enlace del enlace de la imagen.

Fuente: https://github.com/android/platform_packages_apps_browser/blob/master/src/com/android/browser/Controller.java

Solución extraída:

Oyente LongClick:

...
mWebview.setOnLongClickListener(new OnLongClickListener() 

    @Override
    public boolean onLongClick(View v) 
        HitTestResult result = mWebview.getHitTestResult();
        if (result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE) 
            Message msg = mHandler.obtainMessage();
            mWebview.requestFocusNodeHref(msg);
        
    
);
...

Manejador para obtener la URL:

private Handler mHandler = new Handler() 

    @Override
        public void handleMessage(Message msg) 
            // Get link-URL.
            String url = (String) msg.getData().get("url");

            // Do something with it.
            if (url != null) ...
        
    ;

Sé que este es un problema antiguo, pero recientemente me encontré con este problema. Según la respuesta de Perry_ml, utilicé el siguiente código de Kotlin para resolverlo:

webView.setOnLongClickListener 
    val result = webView.hitTestResult
    if (result.type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) 
        val handler = Handler()
        val message = handler.obtainMessage()

        webView.requestFocusNodeHref(message)
        val url = message.data.getString("url")

        // Do something with url, return true as touch has been handled
        true
     else 
        false
    

He publicado algo de información al respecto aquí.

Revisé el código fuente de WebView y parece que la imagen uri es el único dato adicional que puede obtener para SRC_IMAGE_ANCHOR_TYPE. Pero no te enojes aquí, tengo una solución rápida y sucia para ti:

    webview.setOnLongClickListener(new OnLongClickListener() 
        @Override
        public boolean onLongClick(View v) 
            final WebView webview = (WebView) v;
            final HitTestResult result = webview.getHitTestResult();
            if(result.getType()==HitTestResult.SRC_IMAGE_ANCHOR_TYPE) 
                webview.setWebViewClient(new WebViewClient()
                    @Override
                    public boolean shouldOverrideUrlLoading(WebView view, String url) 
                        // 2. and here we get the url (remember to remove the WebView client and return true so that the hyperlink will not be really triggered)
                        mUrl = url; // mUrl is a member variant of the activity
                        view.setWebViewClient(null);
                        return true;
                    
                );
                // 1. the picture must be focused, so we simulate a DPAD enter event to trigger the hyperlink
                KeyEvent event1 = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_CENTER);
                webview.dispatchKeyEvent(event1);
                KeyEvent event2 = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER);
                webview.dispatchKeyEvent(event2);
                // 3. now you can do something with the anchor url (and then clear the mUrl for future usage)
                String url = mUrl;
                if (url!=null) 
                    Toast.makeText(webview.getContext(), url, Toast.LENGTH_SHORT).show();
                

                mUrl = null;
            
            return false;
        
    );

Probé el código en un dispositivo Android 2.1 de gama baja y en un dispositivo Android 4.0 de gama alta, ambos funcionan de maravilla.

Saludos

Ziteng Chen

Si tienes algún duda y disposición de aclarar nuestro ensayo te invitamos realizar una nota y con mucho placer lo ojearemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *