当我调用WebView.loadUrl()时,如何禁止Android WebView / WebViewClient发送对favicon.ico的请求?我可以看到在通过CharlesProxy分析请求时进行的调用。
我不拥有我在WebView中显示的HTML内容。我的研究已经从服务器端找到了很多关于变通方法的结果,但这些对我来说不起作用。
答案 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()方法,以便不执行任何操作。我自己还没试过,但这可能会奏效。