1

我试图在使用后获取加载页面的图标

    WebView webView = new WebView(getActivity());
    webView.loadUrl("http://" + url);

我将异步附加WebViewClientWebView加载后获取图标

    webView.setWebViewClient(new WebViewClient()
    {
        @Override
        public void onPageFinished(WebView view, String url)
        {
            String linkTitle = view.getTitle();
            Bitmap favicon = view.getFavicon();

            onLinkUrlFinished(url, linkTitle);
        }
    });

返回的网站图标始终为空,即使对于肯定有网站图标的网站(例如 google/facebook)也是如此。

另一个线程说要使用WebIconDatabase,但它已被弃用: 显示 Android WebView's favicon

android网站上的API指的是WebViewClient.onReceivedIcon甚至不存在的。http://developer.android.com/reference/android/webkit/WebView.html#getFavicon%28%29

这里发生了什么?

4

5 回答 5

5

为了使用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);
        }
    });
于 2017-03-18T15:52:44.557 回答
2

WebIconDatabase 自 API 19 起已弃用。根据代码中的注释:

@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
    }
}

请记住将您的自定义 WebChromeClient 注册到您的 WebView:

mWebView.setWebChromeClient(new MyCustomWebChromeClient());
于 2014-02-15T04:27:28.600 回答
0

关键是打开WebIconDatabase所以WebView有地方放置图标,并覆盖WebChromeClient.onReceivedIcon. 有关其他信息,请参阅此 StackOverflow 文章

于 2013-09-15T17:26:18.140 回答
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
}

它对我有用,希望它可以帮助新读者,如果它帮助你,请投票,这样你就可以帮助别人!

此致

于 2019-09-12T21:36:21.340 回答
-1

所以最后我没有使用过时的 API,而是我发现如果你把/favicon.ico域放在后面,它会给你ico文件,我最后用它来获取图像。Uri API 将有一个getHost()方法可以为您提供主机,而无需手动解析它

 String faviconUrl = Uri.parse(url).getHost() + "/favicon.ico";

例如,对于 google,图标 url 将是 www.google.com/favicon.ico

于 2013-09-19T17:13:10.283 回答