我正在尝试使用
后获取已加载页面的图标 WebView webView = new WebView(getActivity());
webView.loadUrl("http://" + url);
我将异步WebViewClient
附加到WebView
以在加载后获取favicon
webView.setWebViewClient(new WebViewClient()
{
@Override
public void onPageFinished(WebView view, String url)
{
String linkTitle = view.getTitle();
Bitmap favicon = view.getFavicon();
onLinkUrlFinished(url, linkTitle);
}
});
即使对于谷歌/脸书这样肯定有吸引力的网站,收藏夹依然是空的。
另一个帖子说要使用WebIconDatabase
但它已被弃用:
Display the Android WebView's favicon
Android网站上的API引用的WebViewClient.onReceivedIcon
甚至不存在。http://developer.android.com/reference/android/webkit/WebView.html#getFavicon%28%29
这里发生了什么?
答案 0 :(得分:4)
要使用onReceiveIcon()
,您应该使用setWebChromeClient
。
这就是我所做的,它对我有用。
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
progressBar.setProgress(newProgress);
}
@Override
public void onReceivedIcon(WebView view, Bitmap icon) {
super.onReceivedIcon(view, icon);
webImage.setImageBitmap(icon);
}
});
答案 1 :(得分:1)
从API 19开始,不推荐使用WebIconDatabase。根据代码中的注释:
@deprecated只有在最多的设备上运行时才需要此类 {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}
因此,除非您不想支持API 18及更低版本,否则您仍应使用WebIconDatabase:
WebIconDatabase.getInstance().open(getDir("icons", MODE_PRIVATE).getPath());
然后,无论您想要支持哪种API,都需要在自定义WebChromeClient中指定:
public class MyCustomWebChromeClient extends WebChromeClient {
@Override
public void onReceivedIcon(WebView view, Bitmap icon) {
super.onReceivedIcon(view, icon);
// do whatever with the arguments passed in
}
}
请记住使用WebView注册自定义WebChromeClient:
mWebView.setWebChromeClient(new MyCustomWebChromeClient());
答案 2 :(得分:0)
关键是要打开WebIconDatabase
,以便WebView
放置图标,并覆盖WebChromeClient.onReceivedIcon
。有关其他信息,请参阅this StackOverflow article。
答案 3 :(得分:0)
我知道它是一个老线程,但是,对于那些面临使用Webview客户端获取Favicon的问题。
科特琳:
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
tabTitle.text = view?.title // read website title
loadImg(view) // method to load the favicon
}
private fun loadImg (view: WebView?){
// u can directly use tabImage.setBitmap instead of assigning tabImg as val
val tabImg: ImageView = findViewById(R.id.tabImage)
// creating handler object to delay the associated thread a little bit after onPageFinished is called.
val handler = Handler()
val runnable = Runnable {
if(view?.favicon != null) {
tabImg.setImageResource(0) //remove the default image
tabImg.setImageBitmap(view?.favicon) // set the favicon
}
}
handler.postDelayed(runnable, 200) // delay time 200 ms
}
它对我有用,希望它对新读者有帮助,如果对您有帮助,请投票,以便您可以帮助其他人!
最诚挚的问候
答案 4 :(得分:-1)
所以最后我没有最终使用已弃用的API,相反我发现如果你将/favicon.ico
放在域之后,它会给你ico
文件,我用于最终获取图像。 Uri API将使用getHost()
方法为您提供主机,而无需手动解析它
String faviconUrl = Uri.parse(url).getHost() + "/favicon.ico";
对于谷歌,例如图标网址将是www.google.com/favicon.ico