Deshabilitar Android WebView / WebViewClient Iniciado favicon.ico Solicitar

¿Cómo puedo deshabilitar el WebView / WebView de Android para enviar una solicitud de favicon.ico cuando llamo a WebView.loadUrl ()? Puedo ver la llamada que se está haciendo durante el perfil de las solicitudes a través de CharlesProxy.

No poseo el contenido HTML que estoy mostrando en el WebView. Mi investigación ha dado lugar a una gran cantidad de resultados en soluciones alternativas desde el lado del servidor, pero estos no funcionará para mí.

Logré esto por un pequeño hack. Primero, he creado un archivo de icono 1×1 falso y lo he guardado en la carpeta de activos. Luego he superado el método shouldInterceptRequest () de WebViewClient , donde compruebo la URL si es la solicitud para el archivo favicon y en ese caso devuelve WebResourceResponse con InputStream que contiene nuestro icono falso:

@Override @CallSuper public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { if(!request.isForMainFrame() && request.getUrl().getPath().equals("/favicon.ico")) { try { return new WebResourceResponse("image/png", null, new BufferedInputStream(view.getContext().getAssets().open("empty_favicon.ico"))); } catch (IOException e) { e.printStackTrace(); } } return null; } 

Tenga en cuenta que el InputStream no debe ser cerrado en nuestro código, ya que posteriormente es utilizado por el WebView para leer el icono. El WebviewClient debe establecerse en WebView a través de su instalador:

 mWebView.setWebViewClient(subclassedWebViewClient); 

Para mí la solución completa fue:

  @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { if(url.toLowerCase().contains("/favicon.ico")) { try { return new WebResourceResponse("image/png", null, null); } catch (Exception e) { e.printStackTrace(); } } return null; } @Override @SuppressLint("NewApi") public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { if(!request.isForMainFrame() && request.getUrl().getPath().endsWith("/favicon.ico")) { try { return new WebResourceResponse("image/png", null, null); } catch (Exception e) { e.printStackTrace(); } } return null; } 

Hay un método para la clase WebView llamada getFavicon (). Creo que este método es llamado por WebView para recuperar el favicon desde el servidor mediante la solicitud de emisión. Así que puede intentar extender la clase WebView y reemplazar el método getFavicon () para no hacer nada. No lo he probado yo mismo, pero esto podría funcionar.

  • Android JS en WebView.loadUrl ()
  • Android: comprueba si la solicitud es GET o POST
  • Cómo buscar Android ViewFlipper Ejemplo con varias WebViews
  • Controlador de protocolo WebView de Android
  • El controlador onScaleChanged de WebView se llama varias veces
  • Proguard warning biblioteca clase android.webkit.WebView depende de la clase del programa android.webkit.WebViewClien
  • El bloqueo del sistema al reemplazar shouldInterceptRequest en WebViewClient
  • ¿WebViewClient y WebChromeClient se excluyen mutuamente?
  • ¿Qué se considera onPageFinished en el WebViewClient para Android?
  • Android WebClient, devolver un recurso de imagen a través de WebResourceResponse - no mostrar la imagen
  • Android: cómo interceptar un formulario POST en android WebViewClient en el nivel 4 de API
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.