Android WebView getFavicon()返回null

时间:2013-09-13 20:23:45

标签: java android webview favicon

我正在尝试使用

后获取已加载页面的图标
    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

这里发生了什么?

5 个答案:

答案 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