La mejor manera de interceptar una solicitud de WebView en Android
Estoy utilizando un WebView
en mi aplicación en la que debo interceptar las solicitudes. Actualmente estoy usando el código follwing para hacerlo.
public WebResourceResponse shouldInterceptRequest (WebView view, String url) { HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); conn.setRequestProperty("User-Agent", userAgent); String mime; if (url.lastIndexOf('.') > url.lastIndexOf('/')) { String ext = url.substring(url.lastIndexOf('.') + 1); mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext); } else { mime = "text/html"; } return new WebResourceResponse(mime, "UTF-8", conn.getInputStream()); }
Por encima del código funciona bien en la mayoría de los casos, pero no todo. Por ejemplo, cuando intento iniciar sesión en Outlook, sólo muestra que mi correo electrónico o contraseña es incorrecta, también he visto otros casos en los que las solicitudes se rompen, pero todo funciona bien si me quite shouldInterceptRequest
.
- Agregar una vista al final de Webview
- Android - Webview sólo aplica los encabezados a la solicitud inicial
- ¿Cómo determinar cuándo Android WebView está completamente cargado?
- WebView onPageFinished no se llama cuando MapView está visible
- Diferentes anchos y alturas de DisplayMetrics y $ (window) .width () en WebView
¿Hay alguna mejor manera que la que estoy utilizando actualmente para interceptar las solicitudes?
- ¿Qué diferencia hay entre el uso de WebView y el navegador para la api de vídeo de YouTube?
- Funciones de JavaScript de Android Calling en WebView
- ¿Cómo puedo hacer que webview use el manifiesto de caché HTML5?
- Forzar la visualización web para mostrar los sitios de escritorio
- ¿Cómo configurar WebView como no fullscreen?
- Error al inflacionar la clase android.webkit.WebView ocurre esporádicamente en la producción
- WebView muestra un signo de interrogación en un cuadro azul
- Android Web-view Error I / cromo: "Uncaught ReferenceError:
Hay dos problemas con el código
- Detección de extensión incorrecta
Por ejemplo, cuando el código intenta obtener la extensión de recurso para esta URL:
https://login.live.com/login.srf?wa=wsignin1.0&rpsnv=12&ct=1442476202&rver=6.4.6456.0&wp=MBI_SSL_SHARED&wreply=https:%2F%2Fmail.live.com%2Fdefault.aspx%3Frru%3Dinbox&lc=1033&id=64855&mkt=en-us&cbcxt=mai
aspx%3Frru%3Dinbox&lc=1033&id=64855&mkt=en-us&cbcxt=mai
cual es incorrecto. Hay un método especial para obtener la extensión de la URL: getFileExtensionFromUrl ()
- De acuerdo con el método de documentación
MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext)
puede devolvernull
. En este caso, el código establece un tipo de mime incorrecto para la página.
Aquí está el código de método que tiene en cuenta estos dos problemas
@Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { String ext = MimeTypeMap.getFileExtensionFromUrl(url); String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext); if (mime == null) { return super.shouldInterceptRequest(view, url); } else { HttpURLConnection conn = (HttpURLConnection) new URL( url).openConnection(); conn.setRequestProperty("User-Agent", userAgent); return new WebResourceResponse(mime, "UTF-8", conn.getInputStream()); } }