2016-01-19 46 views
7

WebView.loadUrl()を呼び出すと、Android WebView/WebViewClientがfavicon.icoのリクエストを送信しないようにするにはどうすればよいですか? CharlesProxyを介してリクエストをプロファイリングしている間、コールが行われているのがわかります。Android WebView/WebViewClientを無効にするfavicon.icoリクエスト

私はWebViewに表示しているHTMLコンテンツを所有していません。私の研究では、サーバー側からの回避策に関する多くの結果が出てきましたが、これらは私にとっては役に立たないでしょう。

答えて

-2

getFavicon()というWebViewクラスのメソッドがあります。 WebViewでは、要求を発行してサーバーからファビコンを取得するためにこのメソッドが呼び出されると思います。したがって、WebViewクラスを拡張し、getFavicon()メソッドをオーバーライドして何もしないようにすることができます。私は自分でそれを試していないが、これは動作する可能性があります。

+1

これは動作しません、この方法は同期であり、唯一の現在キャッシュされファビコンのビットマップを返します。 –

5

少しハックでこれを実現しました。まず、偽の1x1アイコンファイルを作成し、assetsフォルダに保存しました。そして、私はそれがファビコンファイルの要求であるかどうか、私はURLをチェックWebViewClient's shouldInterceptRequest()方法を、オーバーライドし、私たちの偽のアイコンを含むInputStreamとその場合のリターンWebResourceResponse中:のInputStreamは、私たちに閉鎖されてはならないこと

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

は注意これはWebViewがアイコンを読み取るために使用されるためです。 WebviewClientはそのセッターを経由してのWebViewに設定する必要があります:完全なソリューションだった

mWebView.setWebViewClient(subclassedWebViewClient); 
+0

非常に役に立ち、私のために働いた。プレLollipopデバイスをサポートする必要がない場合、 'WebResourceResponse'は404ステータスを伝えることができ、ダミーアイコン(または例外処理)は必要ありません。 – rhashimoto

+0

新しいWebResourceResponse( "image/png"、null、null)を返すことができます。 – ventura8

5

私のために:

@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

私の答えからうまく完全にほぼ完全にコピーされました。 –

関連する問題