当我调用WebView.loadUrl()时,Android WebView/WebViewClient如何禁用发送favicon.ico请求?我可以通过CharlesProxy监视请求时看到这个调用。
我不拥有在WebView中显示的HTML内容。我的研究已经找到了很多关于从服务器端解决问题的结果,但这些对我没有用。
当我调用WebView.loadUrl()时,Android WebView/WebViewClient如何禁用发送favicon.ico请求?我可以通过CharlesProxy监视请求时看到这个调用。
我不拥有在WebView中显示的HTML内容。我的研究已经找到了很多关于从服务器端解决问题的结果,但这些对我没有用。
对我来说完整的解决方案是:
@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;
}
@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;
}
mWebView.setWebViewClient(subclassedWebViewClient);
WebResourceResponse
可以传达404状态,您不需要虚拟图标(或异常处理)。 - rhashimoto以下是 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。
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)
}
}
}
WebView类中有一个名为getFavicon()的方法。我认为这个方法是由WebView调用的,通过发出请求从服务器检索favicon。因此,您可以尝试扩展WebView类并覆盖getFavicon()方法以不执行任何操作。我自己还没有尝试过,但这可能有效。
request.isForMainFrame()
可能不会像你期望的那样工作,因为即使最初加载包含 iframe 的 URL,它也会返回 false。请参见:https://dev59.com/3Jvga4cB1Zd3GeqP348F - mtkopone