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í.
- Habilitación de JavaScript general en WebViewClient
- Cargar la imagen en caché de WebView en un ImageView
- Android: abra los vínculos _blank de destino en WebView con un navegador externo
- ¿Cuál es la diferencia entre setWebViewClient y setWebChromeClient?
- ¿Qué hace stopLoading () realmente hacer?
- ShouldOverrideUrlLoading no funciona / captura los clics del enlace mientras la página se está cargando
- Log <GATE-M> DEV_ACTION_COMPLETED </ GATE-M> parece retrasar la ejecución en Android
- Vista Web de Android
- WebViewClient que devuelve "No se pudo establecer una conexión segura." Al recrear el fragmento
- WebView de Android ignorando target = "_ blank" cuando se agrega WebViewClient
- Android 4.4 dando ERR_CACHE_MISS error en onReceivedError para WebView volver
- Obtener recursos de WebView que ya se ha descargado
- Cómo obtener URL de enlace en Android WebView con HitTestResult para una imagen vinculada (y no la URL de imagen) con Longclick
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.
- Appcompat-v7: vista personalizada no alineada correctamente en ActionBar
- ¿Cuál es la diferencia entre rizadores y brackets normales en RxJava con Kotlin