2016-01-19 34 views
7

WebView.loadUrl() işlevini çağırdığımda Android WebView/WebViewClient'i favicon.ico için bir istek göndermekten nasıl devre dışı bırakabilirim? CharlesProxy ile yapılan profil istekleri sırasında yapılan aramaları görebiliyorum.Android WebView/WebViewClient Devre Dışı Bırakıldı favicon.ico İstek

WebView'de görüntülediğiniz HTML içeriğine sahip değilim. Araştırmam, sunucu tarafındaki geçici çözümlerde çok fazla sonuç verdi, ancak bunlar benim için işe yaramayacak.

cevap

-2

getFavicon() adlı WebView sınıfı için bir yöntem var. WebView tarafından, istekte bulunarak sunucudan favicon almak için bu yöntemin kullanılması gerektiğini düşünüyorum. Böylece, WebView sınıfını genişletmeyi deneyebilir ve hiçbir şey yapmamak için getFavicon() yöntemini geçersiz kılabilirsiniz. Kendim denemedim ama bu işe yarayabilir.

+1

Bu işe yaramazsa, yöntem senkron ve sadece şu anda favicon en Bitmap önbelleğe döndürür. –

5

Bunu küçük bir kesmekle başardım. İlk olarak, sahte bir 1x1 simge dosyası oluşturdum ve varlıkları klasörüne kaydettim. O zaman ben bu bizim sahte simge içerir favicon dosyası için ve InputStream ile bu durumda dönüş WebResourceResponse istek olup olmadığını URL'yi kontrol WebViewClient's shouldInterceptRequest() yöntemi, overrode: inputStream kapalı gerektiğini

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

Not bizim kodu, daha sonra simge okumak için WebView tarafından kullanılır. WebviewClient onun setter yoluyla WebView'da ayarlanması gerekir: Benim için

mWebView.setWebViewClient(subclassedWebViewClient); 
+0

Çok yardımcı, benim için çalıştı. Lollipop öncesi aygıtları desteklemeniz gerekmiyorsa, 'WebResourceResponse' bir 404 durumunu iletebilir ve kukla simgeye (veya istisna işlemine) ihtiyacınız yoktur. – rhashimoto

+0

yeni WebResourceResponse ("image/png", null, null) döndürebilirsiniz; – ventura8

5

komple çözüm olarak:

@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

Neredeyse cevabımdan tamamen kopyalanmış, iyi iş;) –