2016-01-19 11 views
7

Wie kann ich den Android WebView/WebViewClient daran hindern, eine Anfrage für favicon.ico zu senden, wenn ich WebView.loadUrl() aufruft? Ich kann sehen, dass der Anruf bei Profilanforderungen über CharlesProxy erfolgt.Android WebView/WebViewClient deaktivieren Initiiert favicon.ico Anfrage

Ich besitze nicht den HTML-Inhalt, den ich in der WebView anzeigen. Meine Recherchen haben viele Ergebnisse auf Workarounds von der Serverseite gebracht, aber diese werden für mich nicht funktionieren.

Antwort

-2

Es gibt eine Methode für die WebView-Klasse namens getFavicon(). Ich denke, dass diese Methode von WebView aufgerufen wird, um das Favicon vom Server abzurufen, indem eine Anforderung ausgegeben wird. Sie können also versuchen, die WebView-Klasse zu erweitern und die Methode getFavicon() außer Kraft zu setzen. Ich habe es selbst nicht versucht, aber das könnte funktionieren.

+1

Dies funktioniert nicht, das Verfahren ist synchron und kehrt nur noch Favicon der Bitmap zwischengespeichert. –

5

Ich erreichte dies durch einen kleinen Hack. Zuerst habe ich eine gefälschte 1x1-Symboldatei erstellt und im Ordner "Assets" gespeichert. Dann überwog ich WebViewClient's shouldInterceptRequest() Methode, wo ich die URL prüfen, ob er die Anforderung für Favicon-Datei ist und in dieser Fall Rückkehr WebResourceResponse mit Input, die unser gefälschten Symbol enthält:

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

Beachten Sie, dass die Input darf nicht in unserem geschlossen werden Code, weil er anschließend vom WebView zum Lesen des Icons verwendet wird. Das WebviewClient muss über seine Setter auf die WebView eingestellt werden:

mWebView.setWebViewClient(subclassedWebViewClient); 
+0

Sehr hilfreich, arbeitete für mich. Wenn Sie keine Pre-Lollipop-Geräte unterstützen müssen, kann 'WebResourceResponse' einen 404-Status übermitteln und Sie benötigen kein Dummy-Symbol (oder die Ausnahmebehandlung). – rhashimoto

+0

Sie könnten neue WebResourceResponse ("image/png", null, null); – ventura8

5

für mich die komplette Lösung war:

@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

Schön fast komplett von meiner Antwort kopiert, gute Arbeit;) –