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

时间:2016-01-19 20:44:10

标签: android android-webview favicon webviewclient

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

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

5 个答案:

答案 0 :(得分:5)

我通过一点点破解实现了这个目标。首先,我创建了一个假的1x1图标文件并将其保存到assets文件夹中。然后我覆盖WebViewClient's 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;
    }

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

mWebView.setWebViewClient(subclassedWebViewClient);

答案 1 :(得分:5)

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

function getXY(array $xyArray, $x = 'min', $y = 'min')
{
    $xFlag = $x === 'max' ? SORT_DESC : SORT_ASC;
    $yFlag = $y === 'max' ? SORT_DESC : SORT_ASC;

    array_multisort(
        array_column($xyArray, 'x'), $xFlag, 
        array_column($xyArray, 'y'), $yFlag,
        $xyArray
    );

    return array_shift($xyArray);
}

答案 2 :(得分:1)

这是Kotlin的答案

override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest?): WebResourceResponse? {
    return if (request?.url?.lastPathSegment == "favicon.ico") {
        WebResourceResponse("image/png", null, null)
    } else {
        super.shouldInterceptRequest(view, request)
    }
}

默认情况下,Android Studio生成代码时,返回类型不可为 WebResourceResponse ,但是它不起作用,因此请将返回类型更改为可为 WebResourceResponse

答案 3 :(得分:1)

您只需将一些伪InputStream传递给WebResourceResponse,如下所示。

my_webview.webViewClient = object : WebViewClient() {
    override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest?): WebResourceResponse? {
        if (request?.url?.toString()?.toLowerCase()?.endsWith("/favicon.ico") == true) {
            val inputStream = "".byteInputStream(Charset.defaultCharset())
            return WebResourceResponse("text", "UTF-8", inputStream)
        } else {
            return super.shouldInterceptRequest(view, request)
        }
    }
}

答案 4 :(得分:-2)

WebView类的方法名为getFavicon()。我认为WebView调用该方法通过发出请求从服务器检索favicon。因此,您可以尝试扩展WebView类并覆盖getFavicon()方法,以便不执行任何操作。我自己还没试过,但这可能会奏效。