Qué hacer con una IOException en WebViewClient.shouldInterceptRequest ()
Estoy tratando de interceptar las solicitudes de un WebView para que pueda inyectar encabezados adicionales. Estoy aplicando un WebViewClient al WebView y anulando shouldInterceptRequest()
.
En shouldInterceptRequest()
abro la conexión, agrego las cabeceras, y entonces vuelvo el flujo abierto en un WebResourceResponse.
- Java.io.IOException: Error ejecutando exec () Directorio de trabajo: null Medio ambiente: null
- Error del emulador de Android -ddmlib error
- HttpUrlConnection getOutputStream lanza IOException
- Obtener el código de respuesta de HttpURLConnection en android
- Uso de la herramienta jobb en Android
No está claro para mí cómo se debe manejar una IOException si falla la apertura inicial de la conexión.
final Map<String, String> extraHeaders = getExtraHeaders(intent); webview.setWebViewClient(new WebViewClient() { @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { final Uri uri = request.getUrl(); try { URL url = new URL(uri.toString()); URLConnection con = url.openConnection(); for (Map.Entry<String, String> h : extraHeaders.entrySet()) { con.addRequestProperty(h.getKey(), h.getValue()); } final String contentType = con.getContentType().split(";")[0]; final String encoding = con.getContentEncoding(); return new WebResourceResponse(contentType, encoding, con.getInputStream()); } catch (IOException e) { // what should we do now? e.printStackTrace(); } return super.shouldInterceptRequest(view, request); } });
No puedo dejarlo sin ser detectado, ya que es una excepción comprobada y no forma parte de la firma shouldInterceptRequest()
.
No puedo envolverlo en una excepción no comprobada, ya que entonces no es capturado por el WebView y mata la aplicación.
Si capto e ignoro la excepción, y por defecto al método super
(que acaba de devolver null
), entonces el WebView continuará con su comportamiento predeterminado y tratará de enviar la solicitud (sin mis encabezados adicionales). Esto no es deseable, ya que el propio intento de conexión de WebView puede tener éxito, y los encabezados que faltan causarán más problemas más abajo de la línea.
Parece que no hay manera de indicar que la intercepción ha fallado y la solicitud debe ser abortada.
¿Qué es lo mejor que hacer aquí?
He intentado devolver una respuesta de error falsa, pero esto no se trata como un error. El WebView muestra una página con el contenido de la respuesta (el mensaje de error de la excepción) y las devoluciones de onReceivedError()
o onReceivedHttpError()
no se llaman.
} catch (IOException e) { InputStream is = new ByteArrayInputStream(e.getMessage().getBytes()); return new WebResourceResponse("text/plain", "UTF-8", 500, "Intercept failed", Collections.<String, String>emptyMap(), is); }
- Obtener excepción IO al crear un archivo en Android?
- Solicitud de excepción de Android en IOException al recuperar JSON de URL
- IOException en aceptar subproceso
- Android Bluetooth .conect () excepción Nexus 7 OBDII adaptador
- Android SOAP IOException "BufferedInputStream está cerrado"
- Java: La excepción en sí es nula
- IOException durante la lectura de InputStream
- SDK de Google Drive para OCR
Puede intentar instanciar un nuevo WebResourceError y, a continuación, llamar a WebViewClient.onReceivedError . Nunca he intentado una cosa así, pero así es como sería:
} catch (final IOException e) { WebResourceError wre = new WebResourceError(){ @Override public CharSequence getDescription (){ return e.toString(); } @Override public int getErrorCode (){ return WebViewClient.ERROR_CONNECT; } }; onReceivedError(view, request, wre); return true; }
También hay una versión obsoleta de onReceivedError
que podría utilizar si no desea o no puede instanciar un WebResourceError
.
Indica que se ha producido una excepción de E / S de algún tipo. Esta clase es la clase general de excepciones producidas por operaciones de E / S falladas o interrumpidas.
IOException () Construye una IOException con null como su mensaje de error.
IOException (String message) Constrói una IOException con el mensaje de detalle especificado.
IOException (String message, Throwable cause) Construye una IOException con el mensaje de detalle especificado y cause.
IOException (Throwable cause) Construye una IOException con la causa especificada y un mensaje de detalle de (causa == null? Null: cause.toString ()) que contiene la clase y el mensaje de causa de causa.
tiene ejemplos en IOException
aquí :
- Los enlaces ocultos todavía se pueden hacer clic en el navegador de Android
- Cómo deshabilitar la animación de una actividad al llamar a moveTaskToBack ()?