BitmapFactory.decodeFile可以处理.ICO(Windows图标)文件吗?

时间:2010-04-22 11:55:38

标签: android bitmap icons

我正在使用Android。试图显示“favicon”(又名“快捷图标”)或网页。

所以我已经有了从任何网站获取此图标的URL的代码,并将其下载到我的Android上。

现在我试图用它来制作一个Bitmap,但结果总是得到null。

代码:

String src = String.format("file:///data/data/com.intuitiveui.android/files/%s",prefName);
// prefName is "facebook.ico", and I do see tht file in my DDMS file browser. It's
// a valid icon file.

Bitmap res = BitmapFactory.decodeFile(src);
// This returns null

TIA

6 个答案:

答案 0 :(得分:4)

以下是supported Android media formats的列表。 ICO不在其中。但是,您可能能够找到基于Java的ICO解码器。

答案 1 :(得分:2)

SKIA库为ICO文件提供解码器类。我能够在模拟器中显示ICO文件。还没有在实际的Android设备中尝试过它。

Bitmap bmap = BitmapFactory.decodeFile("/sdcard/vlc.ico");

答案 2 :(得分:1)

WebView component has a getFavicon() method所以在Android中解码ICO文件肯定是可能的。您可以have a look at the Android source查看如何解析ICO文件。我看了一眼,但找不到相关的部分。

或者,您应该使用SDK为您获取favicon。但是,我已经快速尝试了,无法让它发挥作用。

这是值得的,这是我的测试代码,再次注意这不起作用

    String url = "http://stackoverflow.com";
    WebView wv = new WebView(this);
    wv.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            Log.i("HelloAndroid","Loaded " + url);              
            Log.i("HelloAndroid","Icon " + (view.getFavicon() == null ? "not" : "") + " found");
        }

    });
    WebIconDatabase wid = WebIconDatabase.getInstance();
    wid.requestIconForPageUrl(url, new WebIconDatabase.IconListener() {
        public void onReceivedIcon(String url, Bitmap icon) {
            Log.i("HelloAndroid","Found Icon for " + url);
        }
    });
    wv.loadUrl("http://stackoverflow.com");
    Log.i("HelloAndroid","Loading " + url);

问题可能在于我没有将WebView添加到可见的View。如果你确实这样做了,我会有兴趣听听你做了什么。

很遗憾给出两个半完整的答案,但我认为值得张贴我找到的答案。

答案 3 :(得分:1)

我有类似的问题。 BitmapFactory.decode在模拟器上解码* .ico但在我的Galaxy S上没有。解决方案对我来说是:

                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                int read=0;
                while((read = inputStream.read()) != -1){
                     bos.write(read);
                }

                byte[] ba = bos.toByteArray(); 
                Bitmap icon = BitmapFactory.decodeByteArray(ba, 0, ba.length);//new FlushedInputStream(inputStream));

答案 4 :(得分:0)

现在没有接受的答案,我会在这里分享我的发现。

Windows .ico文件格式有点复杂,它可能包含多个大小和颜色深度的一个或多个小图像,这样它们可以适当缩放。请参阅ICO_(file_format)

所以当使用unix" file"命令检查图标文件类型,您可能会得到以下结果:

  • a.ico :MS Windows图标资源 - 1个图标,32x32
  • b.ico :MS Windows图标资源 - 9个图标,256x256

注意 a.ico b.ico 包含不同数量的图标。

我尝试使用 BitmapFactory.decodeFile 来解码这些图标。

  • Android 4.3的两款Android设备只能解码 a.ico ,但无法解码 b.ico
  • 使用Android 4.4或更高版本的设备可以解码 a.ico b.ico

由于我只有有限的Android设备,我无法给出任何结论。也许其他任何人都可以提供帮助。

因此,如果你真的想要解码.ico文件,你可以尝试:

  • 创建仅包含1张图片/图片的.ico文件
  • 编写您自己的.ico解码器或第三个库,如image4j

答案 5 :(得分:0)

由于 Picasso 似乎没有解析.ico文件,因此我也对此感到困惑。 但是令人惊讶的是,该解决方案非常简单。

<appender name="plainLogsToFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>/${LOG_PATH:-/tmp/default}/service.log</file>
</appender>

对我来说,该解决方案可用于大多数网站,但是只要图标文件的大小过小,它都会生成一个空位图。