2016-01-19 35 views
7

Come disabilitare Android WebView/WebViewClient dall'invio di una richiesta di favicon.ico quando chiamo WebView.loadUrl()? Riesco a vedere la chiamata che viene effettuata mentre si creano profili tramite CharlesProxy.Disabilita Android WebView/WebViewClient Initiato favicon.ico Richiesta

Non possiedo il contenuto HTML che sto visualizzando in WebView. La mia ricerca ha generato molti risultati su soluzioni alternative dal lato server, ma queste non funzioneranno per me.

risposta

-2

Esiste un metodo per la classe WebView denominata getFavicon(). Penso che questo metodo sia chiamato da WebView per recuperare la favicon dal server emettendo una richiesta. Quindi puoi provare ad estendere la classe WebView e sovrascrivere il metodo getFavicon() per non fare nulla. Non l'ho provato da solo, ma potrebbe funzionare.

+1

Questo non funziona, il metodo è sincrona e restituisce solo attualmente nella cache bitmap di favicon. –

5

Ho raggiunto questo risultato con un piccolo trucco. Innanzitutto, ho creato un file icona 1x1 falso e l'ho salvato nella cartella delle risorse. Poi ho calpestato WebViewClient's shouldInterceptRequest() metodo, dove posso controllare l'URL se è la richiesta di file di favicon e in quel WebResourceResponse caso di ritorno con l'InputStream che contiene la nostra icona 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; 
    } 

Si noti che l'InputStream non deve essere chiuso nella nostra codice, perché successivamente viene utilizzato da WebView per leggere l'icona. Il WebviewClient deve essere impostato il WebView attraverso il suo setter:

mWebView.setWebViewClient(subclassedWebViewClient); 
+0

Molto utile, ha funzionato per me. Se non è necessario supportare dispositivi pre-Lollipop, allora WebResourceResponse' può trasmettere uno stato 404 e non è necessario l'icona fittizia (o la gestione delle eccezioni). – rhashimoto

+0

potresti restituire nuovo WebResourceResponse ("image/png", null, null); – ventura8

5

per me la soluzione completa era:

@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; 
    } 
+0

Quasi completamente copiato dalla mia risposta, buon lavoro;) –