【问题标题】:How to disable WebView load favicon.ico (i.e. specific URL)?如何禁用 WebView 加载 favicon.ico(即特定 URL)?
【发布时间】:2017-04-18 21:34:48
【问题描述】:
  1. 在我的 Android 应用程序中,我使用 WebView 来显示横幅。
  2. 横幅布局中有多个 URL,但 没有指向 .../favicon.ico 的 URL
  3. WebView 自动尝试根据我的基本 URL + /favicon.ico 加载 favicon.ico,得到响应 404 并且 不加载最近的 RUL

如果重要:

  • 基本 URL 从 https://...开始
  • 响应使用 SSL 证书
  • 响应具有额外的授权标头

有可能阻止 WebView 加载 favicon 在得到 404 响应后允许它加载其他链接

    webView.setWebViewClient(new WebViewClient() {

        ...@Override onReceivedError...

        @SuppressWarnings("deprecation")
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
            return getNewResponse(url);
        }

        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
            String url = request.getUrl().toString();
            return getNewResponse(url);
        }

        private WebResourceResponse getNewResponse(String url) {

            try {
                OkHttpClient client = MyOkHttpClient.getInstance();

                Request.Builder requestBuilder = new Request.Builder();
                requestBuilder.url(url.trim())
                        .addHeader("api-key", Constants.API_KEY)
                        .addHeader("platform", Constants.PLATFORM);

                Request request = requestBuilder.build();

                Response response = client.newCall(request).execute();

                return new WebResourceResponse(
                        getMimeType(url),
                        response.header("content-encoding", "utf-8"),
                        response.body().byteStream()
                );

            } catch (Exception e) {
                return null;
            }

        }

        private String getMimeType(String url) {
            ...
            return type;
        }

    });

【问题讨论】:

标签: java android android-webview


【解决方案1】:

是的,你可以这样做。但它不能在棒棒糖之前的设备上工作。 首先创建一个不可见的虚拟图标,然后将该图标粘贴到您的资产文件夹中。现在,只要您获得网站图标就可以显示它,如果没有,则您的资产文件夹会加载虚拟图标。

@Override
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("dummyfavicon.ico")));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return null;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    相关资源
    最近更新 更多