¿Realmente se ha desaprobado “shouldOverrideUrlLoading”? ¿Qué puedo usar en su lugar?

Tengo una pregunta / problema, ¿realmente se ha desaprobado “shouldOverrideUrlLoading”? Si es así, ¿qué puedo usar en su lugar?

Parece que shouldOverrideUrlLoading está en desuso para 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 funciones que son nuevas en Android N (como Data Saver), por lo que La orientación a Marshmallow no ayudará con el problema ya que necesito usar esas nuevas características, esta es 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 dónde se usa el código obsoleto en el scope de inspección especificado.

Google no dice nada sobre esa desaprobación .

Me pregunto si usar @SuppressWarnings("deprecation") me permitirá trabajar en todos los dispositivos desde la API 19 hasta la última versión de Android N Beta (y su versión final cuando se publique), no puedo probarlo yo mismo, nunca lo usé eso y necesito estar seguro de que funciona, entonces, ¿alguien puede decirlo?

Muchas gracias.

La versión que estoy usando creo que es la buena, ya que es exactamente la misma que la de los Documentos para Desarrolladores de Android, excepto por el nombre de la cadena, ellos usaron “ver” y yo usé “webview”, porque el rest es el mismo

No, no 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, incluido N, tiene esta firma de método:

 public boolean shouldOverrideUrlLoading(WebView view, String url) 

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

Anule el obsoleto, el que toma una String como el segundo parámetro.

Documentando en detalle para futuros lectores:

La respuesta corta es que debes anular ambos métodos. El shouldOverrideUrlLoading(WebView view, String url) está en desuso en API 24 y el shouldOverrideUrlLoading(WebView view, WebResourceRequest request) se agrega en API 24. Si se dirige a versiones anteriores de android, necesita el método anterior, y si están orientados a 24 (o más adelante, 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 // eg open web page in a Browser final Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); return true; } } } 

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

Utilizar

 public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { view.loadUrl(request.getUrl().toString()); return true; }