禁用Android WebView/WebViewClient启动的favicon.ico请求

Tra*_*Yim 8 favicon android android-webview webviewclient

当我调用WebView.loadUrl()时,如何禁用Android WebView/WebViewClient发送对favicon.ico的请求?我可以看到在通过CharlesProxy分析请求时进行的调用.

我不拥有我在WebView中显示的HTML内容.我的研究已经从服务器端找到了很多关于变通方法的结果,但这些对我来说不起作用.

ven*_*ra8 7

对我来说,完整的解决方案是:

   @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;
    }
Run Code Online (Sandbox Code Playgroud)


Mil*_*ský 5

我通过一点点破解实现了这一点.首先,我创建了一个假的1x1图标文件并将其保存到assets文件夹中.然后我覆盖了WebViewClient的shouldInterceptRequest()方法,在那里我检查URL是否是对favicon文件的请求,在这种情况下返回带有InputStream的WebResourceResponse,其中包含我们的假图标:

    @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;
    }
Run Code Online (Sandbox Code Playgroud)

请注意,不能在我们的代码中关闭InputStream,因为WebView随后会使用它来读取图标.WebviewClient必须通过其setter设置为WebView:

mWebView.setWebViewClient(subclassedWebViewClient);
Run Code Online (Sandbox Code Playgroud)


Aru*_*abu -2

WebView 类有一个名为 getFavicon() 的方法。我认为 WebView 调用该方法通过发出请求从服务器检索网站图标。因此,您可以尝试扩展 WebView 类并重写 getFavicon() 方法以不执行任何操作。我自己还没有尝试过,但这可能有用。