Tra*_*Yim 8 favicon android android-webview webviewclient
当我调用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;
}
Run Code Online (Sandbox Code Playgroud)
我通过一点点破解实现了这一点.首先,我创建了一个假的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() 方法以不执行任何操作。我自己还没有尝试过,但这可能有用。
| 归档时间: |
|
| 查看次数: |
3875 次 |
| 最近记录: |