studio android webview webclient intercept

webview android studio documentation



¿Diferencia entre la carga del hombro y la solicitud de intercepción? (3)

Intenta comprender de esta manera, espero que esto te ayude a resolver tu problema.

public WebResourceResponse shouldInterceptRequest (vista de WebView, url de cadena)

Added in API level 11 This method was deprecated in API level 21. Use shouldInterceptRequest(WebView, WebResourceRequest) instead. Notify the host application of a resource request and allow the application to return the data. If the return value is null, the WebView will continue to load the resource as usual. Otherwise, the return response and data will be used. NOTE: This method is called on a thread other than the UI thread so clients should exercise caution when accessing private data or the view system. Parameters view The WebView that is requesting the resource. url The raw url of the resource. Returns A WebResourceResponse containing the response information or null if the WebView should load the resource itself.

public boolean shouldOverrideUrlLoading (vista de WebView, url de cadena)

Added in API level 1 Give the host application a chance to take over the control when a new url is about to be loaded in the current WebView. If WebViewClient is not provided, by default WebView will ask Activity Manager to choose the proper handler for the url. If WebViewClient is provided, return true means the host application handles the url, while return false means the current WebView handles the url. This method is not called for requests using the POST "method". Parameters view The WebView that is initiating the callback. url The url to be loaded. Returns True if the host application wants to leave the current WebView and handle the url itself, otherwise return false.

Ref: http://developer.android.com/reference/android/webkit/WebViewClient.html

Cualquiera por favor dígame la diferencia entre los métodos public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request) y public boolean shouldOverrideUrlLoading(WebView view, String url) .

Estoy creando una aplicación de Android en la que se obtiene una cadena como la respuesta de un evento de clic en mi WebView . Quiero almacenar esta cadena y mostrarla. Vi estos dos shouldOverrideUrlLoading Intenté usar shouldOverrideUrlLoading que devuelve la URL de redirección. cuando revisé la creación de una aplicación de muestra usando google.com como la url que cargué en mi WebView y hice clic en un menú.

¿Alguien podría decirme la diferencia entre ambos métodos y cuál debo usar?


Creo que shouldOverrideUrlLoading se invoca cuando se carga una nueva página en la vista web, por ejemplo, cuando se realiza la inicial:

webview.loadUrl( "file:///android_asset/web/index.html" );

Se invocará su shouldoverrideupload, y se invocará nuevamente si el usuario hace clic en un enlace para navegar a una nueva página.

shouldInterceptRequest debe ser llamado para todas las solicitudes hechas dentro de la página actual, ej. cuando importo fuentes HTML, veo que se llama a shouldInterceptRequest, o cuando la webView intenta cargar imágenes en mi página se llama (pero no lo veo llamado para solicitudes ajax, así que todavía estoy un poco confundido).


La implementación de Android WebKit permite al desarrollador modificar una WebView a través de la clase android.webkit.WebSettings , como

  • Soporte para JavaScript,
  • Soporte para complementos,
  • Acceso al sistema de archivos
  • Inspección de recursos, etc.

En la Inspección de recursos , es posible inspeccionar las solicitudes de contenido y / o recursos anulando los métodos shouldOverrideUrlLoading y shouldInterceptRequest .

Pero por encima de dos métodos se utilizan para fines diferentes, tales como

1. Se llama a shouldOverrideUrlLoading cuando se va a abrir una nueva página, mientras que se llama a shouldInterceptRequest cada vez que se carga un recurso como un archivo css, un archivo js, ​​etc.

2. Si un usuario solicita interactivamente un recurso desde una WebView, es posible mediante el uso del método shouldOverrideUrlLoading de la clase WebViewClient para interceptar la solicitud. El código de ejemplo se presenta a continuación. Fuente

private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (Uri.parse(url).getHost().equals("www.google.com")) { return true; } return false; } }

El método le da a la aplicación de host la posibilidad de hacerse cargo del control cuando una nueva URL está a punto de cargarse en el WebView actual. Un valor de retorno de verdadero significa que la aplicación de host maneja la URL, mientras que return false significa que la WebView actual maneja la URL. El código anterior impide que los recursos se carguen desde el host "www.google.com".

Sin embargo, el método no intercepta la carga de recursos desde dentro, como desde un IFRAME o un atributo src dentro de una etiqueta HTML o SCRIPT, por ejemplo. Además XmlHttpRequests tampoco sería interceptado. Para interceptar estas solicitudes, puede hacer uso del método WebViewClient shouldInterceptRequest . El código de ejemplo se presenta a continuación.

@Override public WebResourceResponse shouldInterceptRequest(final WebView view, String url) { if (url.contains(".js")) { return getWebResourceResponseFromString(); } else { return super.shouldInterceptRequest(view, url); } } private WebResourceResponse getWebResourceResponseFromString() { return getUtf8EncodedWebResourceResponse(new StringBufferInputStream("alert(''!NO!'')")); } private WebResourceResponse getUtf8EncodedWebResourceResponse(InputStream data) { return new WebResourceResponse("text/javascript", "UTF-8", data); }

El método notifica a la aplicación de host de una solicitud de recursos y permite que la aplicación devuelva los datos. Si el valor de retorno es nulo, WebView continuará cargando el recurso como de costumbre. De lo contrario, se usarán la respuesta de devolución y los datos. El código anterior intercepta las solicitudes de recursos de JavaScript (.js) y devuelve una alerta en lugar del recurso solicitado.

Ver más en: WebViewClient shouldOverrideUrlLoading y shouldInterceptRequest