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.

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); } 

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í :

http://examples.javacodegeeks.com/core-java/io/ioexception/java-io-ioexception-how-to-solve-ioexception/

  • Android reproducir archivos de recursos desde el almacenamiento interno provoca que MediaPlayer.prepare dé IOException
  • Nuevo error de origen desconocido del registro de la API de GCM
  • Java.io.ioexception: open failed: einval (argumento no válido) al guardar una imagen en un almacenamiento externo
  • ¿Qué causa la herramienta jobb para lanzar FAT IOException completa?
  • ¿Existe un límite para el número de archivos en un directorio de una tarjeta SD?
  • Xml extraer elementos del analizador xml
  • MediaPlayer.setDataSource provoca IOException para archivo válido
  • IOException - No se puede cargar el archivo
  • Java.io.IOException: No se han encontrado problemas de autenticación
  • Android Exception: java.io.IOException: open failed: EACCES (permiso denegado)
  • Java.io.IOException: No queda espacio en el dispositivo Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.