Es "shouldOverrideUrlLoading" realmente obsoleto? ¿Qué puedo usar en su lugar?


Tengo una pregunta / problema, es "shouldOverrideUrlLoading" realmente obsoleto? Si es así, ¿qué puedo usar en su lugar?

Parece que shouldOverrideUrlLoading está en desuso apuntando a Android N y necesito hacer que una aplicación funcione desde API 19 hasta la última en este momento que es Android N (beta), uso algunas características que son nuevas en Android N (como Data Saver), por lo que apuntar a Marshmallow no ayudará con el problema ya que necesito usar esas nuevas características, aquí está la parte del código que uso:

public boolean shouldOverrideUrlLoading(WebView webview, String url) {
    if (url.startsWith("http:") || url.startsWith("https:")) {
        ...
    } else if (url.startsWith("sms:")) {
        ...
    }
    ...
}

Y este es el mensaje que me dio Android Studio:

Anula el método obsoleto en 'android.webkit.WebViewClient" Esta inspección informa donde el código obsoleto se utiliza en el ámbito de inspección especificado.

Google no dice nada acerca de esa obsolescencia .

Me pregunto si usar @SuppressWarnings("deprecation") me permitirá trabajar en todos los dispositivos desde la API 19 hasta la última Versión Beta de Android N (y su versión final cuando se lance), no puedo probar yo mismo, yo nunca he usado eso y necesito estar seguro de que funciona, así que nadie puede decir?

Muchas Gracias.

Author: Minion, 2016-04-07

3 answers

La versión que estoy usando creo que es la buena, ya que es exactamente la misma que los Documentos de Desarrollador de Android, excepto por el nombre de la cadena, usaron "view" y yo usé "webview", para el resto es la misma

No, no lo es.

El que es nuevo en N Developer Preview tiene esta firma de método:

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

El que es compatible con todas las versiones de Android, incluida N, tiene esta firma de método:

public boolean shouldOverrideUrlLoading(WebView view, String url)

Entonces, ¿por qué debería hacer para hacerlo trabajar en todas las versiones?

Anula el obsoleto, el que toma un String como segundo parámetro.

 72
Author: CommonsWare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-19 07:08:07

Documentando en detalle para futuros lectores:

La respuesta corta es que necesita anular ambos métodos. El método shouldOverrideUrlLoading(WebView view, String url) está obsoleto en API 24 y el método shouldOverrideUrlLoading(WebView view, WebResourceRequest request) se agrega en API 24. Si está apuntando a versiones anteriores de Android, necesita el método anterior, y si está apuntando a 24 (o más tarde, si alguien está leyendo esto en un futuro lejano) es aconsejable anular el último método también.

El siguiente es el esqueleto sobre cómo lograrías esto:

class CustomWebViewClient extends WebViewClient {

    @SuppressWarnings("deprecation")
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        final Uri uri = Uri.parse(url);
        return handleUri(uri);
    }

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

    private boolean handleUri(final Uri uri) {
        Log.i(TAG, "Uri =" + uri);
        final String host = uri.getHost();
        final String scheme = uri.getScheme();
        // Based on some condition you need to determine if you are going to load the url 
        // in your web view itself or in a browser. 
        // You can use `host` or `scheme` or any part of the `uri` to decide.
        if (/* any condition */) {
            // Returning false means that you are going to load this url in the webView itself
            return false;
        } else {
            // Returning true means that you need to handle what to do with the url
            // e.g. open web page in a Browser
            final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
            startActivity(intent);
            return true;
        }
    }
}

Al igual que shouldOverrideUrlLoading, se puede llegar a un enfoque similar para el método shouldInterceptRequest.

 149
Author: Henry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-20 14:28:46

Use

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
    view.loadUrl(request.getUrl().toString());
    return true;
}
 14
Author: saleem kalro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-16 04:29:17