2016-01-19 12 views
7

Jak wyłączyć Android WebView/WebViewClient przed wysłaniem zapytania o favicon.ico, gdy zadzwonię do WebView.loadUrl()? Widzę, że połączenie jest wykonywane podczas profilowania żądań za pośrednictwem CharlesProxy.Wyłączanie usługi Android WebView/WebViewClient Zainicjowana prośba favicon.ico

Nie jestem właścicielem treści HTML, które wyświetlam w WebView. Moje badania przyniosły wiele wyników dotyczących obejść po stronie serwera, ale te nie będą działać dla mnie.

Odpowiedz

-2

Istnieje metoda dla klasy WebView o nazwie getFavicon(). Wydaje mi się, że metoda ta jest wywoływana przez WebView w celu pobrania favikonu z serwera poprzez wysłanie żądania. Możesz więc spróbować rozszerzyć klasę WebView i zastąpić metodę getFavicon(), aby nic nie robić. Sam tego nie próbowałem, ale to może zadziałać.

+1

ten nie działa, metoda jest synchroniczna i zwraca tylko aktualnie buforowane Bitmap Favicon za. –

5

Osiągnąłem to przez mały hack. Najpierw utworzyłem fałszywy plik ikony 1x1 i zapisałem go w folderze zasobów. Potem overrode WebViewClient's shouldInterceptRequest() metodę, gdzie mogę sprawdzić URL czy jest to prośba o pliku favicon iw tym WebResourceResponse przypadek powrotnej z InputStream, który zawiera nasz fałszywy ikony:

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

Należy pamiętać, że InputStream nie musi być zamknięta w naszym kod, ponieważ jest on następnie używany przez WebView do odczytywania ikony. WebviewClient musi być ustawiony na WebView poprzez jego seter:

mWebView.setWebViewClient(subclassedWebViewClient); 
+0

Bardzo pomocny, pracował dla mnie. Jeśli nie potrzebujesz obsługi urządzeń pre-Lollipop, 'WebResourceResponse' może przekazać status 404 i nie potrzebujesz ikony dummy (lub obsługi wyjątków). – rhashimoto

+0

możesz zwrócić nową WebResourceResponse ("image/png", null, null); – ventura8

5

dla mnie kompletnym rozwiązaniem było:

@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

Ładnie prawie całkowicie skopiowany z mojej odpowiedzi, dobra robota;) –

Powiązane problemy