shouldoverrideurlloading developer android android-studio android-webview deprecated deprecation-warning

android developer shouldoverrideurlloading



¿`ShouldOverrideUrlLoading` está realmente en desuso? ¿Qué puedo usar en su lugar? (4)

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, usaron "ver" y yo usé "vista web", porque el resto es el mismo

No, no es.

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

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

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

public boolean shouldOverrideUrlLoading(WebView view, String url)

Entonces, ¿por qué debo hacer para que funcione en todas las versiones?

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

¿"ShouldOverrideUrlLoading" está realmente en desuso? Si es así, ¿qué puedo usar en su lugar?

Parece que shouldOverrideUrlLoading está en desuso dirigido 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), utilizo algunas funciones 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 funciones, 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:

Invalida el método obsoleto en ''android.webkit.WebViewClient''. Esta inspección informa dónde se utiliza el código obsoleto en el alcance 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 lance), no puedo probarlo yo mismo, nunca lo usé eso y necesito estar seguro de que funciona, entonces, ¿alguien puede decirlo?


Documentación detallada para futuros lectores:

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

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 , puede llegar a un enfoque similar para el método shouldInterceptRequest .


Implemente métodos obsoletos y no obsoletos como a continuación. El primero es manejar el nivel 21 de API y superior, el segundo es manejar más bajo que el nivel 21 de API

webViewClient = object : WebViewClient() { . . @RequiresApi(Build.VERSION_CODES.LOLLIPOP) override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean { parseUri(request?.url) return true } @SuppressWarnings("deprecation") override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean { parseUri(Uri.parse(url)) return true } }


Utilizar

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