Android BitmapFactory.decodeFile能否处理.ICO(Windows图标)文件?

Android BitmapFactory.decodeFile能否处理.ICO(Windows图标)文件?,android,bitmap,icons,Android,Bitmap,Icons,我在安卓上工作。试图显示“favicon”(又名“快捷图标”)或网页 因此,我已经有了从任何网站获取该图标URL的代码,并将其下载到我的Android上 现在我正试图用它制作位图,但结果总是为空 守则: String src = String.format("file:///data/data/com.intuitiveui.android/files/%s",prefName); // prefName is "facebook.ico", and I do see tht file in m

我在安卓上工作。试图显示“favicon”(又名“快捷图标”)或网页

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

现在我正试图用它制作位图,但结果总是为空

守则:

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

以下是一个列表。ICO不在其中。不过,您可能会找到一个基于Java的ICO解码器。

因此,在Android中解码ICO文件绝对是可能的。您可以查看如何解析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
添加到可见的
视图中。如果你真的能把这件事做好,我很想知道你做了什么


很抱歉给出了两个半完整的答案,但我认为值得发布我的发现。

我也有类似的问题。BitmapFactory.decode已在emulator上解码*.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));

SKIA库为ICO文件提供了解码器类。我能够在模拟器中显示ICO文件。不过,我还没有在真正的android设备上尝试过


Bitmap bmap=BitmapFactory.decodeFile(“/sdcard/vlc.ico”)

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

ico文件格式有点复杂,它可能包含一个或多个具有多种大小和颜色深度的小图像,以便可以适当缩放它们。提及

因此,使用unix“file”命令检查图标文件类型时,可能会得到以下结果:

  • a、 ico:MS Windows图标资源-1个图标,32x32
  • b、 ico:MS Windows图标资源-9个图标,256x256
注a.ico和b.ico包含不同数量的图标

我尝试使用BitmapFactory.decodeFile对这些图标进行解码

  • 安卓4.3的两台安卓设备只能解码a.ico,但不能解码b.ico
  • Android 4.4或更高版本的设备可以同时解码a.ico和b.ico
由于我只有有限的安卓设备,我不能给出任何结论。也许其他人可以帮忙

因此,如果您确实想解码.ico文件,您可以尝试:

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

    • 我也被这个问题困扰,因为毕加索似乎没有解析.ico文件。 然而,令人惊讶的是,解决方案相当简单

      InputStream in = new java.net.URL("https://" + domain + "/favicon.ico").openStream();
      Bitmap b = BitmapFactory.decodeStream(in);
      

      对我来说,这个解决方案适用于大多数网站,但每当图标文件的大小异常小时,就会生成一个空位图。

      Hi,有趣的是-我确实使用:bitmap bmp=BitmapFactory.decodeStream(in);when in是HttpURLConnection的输入流。这将使ICO文件处于良好状态。但是,当我第一次尝试将ICO保存到一个文件时:FileOutputStream f=openFileOutput(“facebook.ICO”,MODE\u WORLD\u READABLE);然后从(InputStream)中读取到这个OutputStream,我确实看到一个创建的文件facebook.ico。但是当我尝试调用位图bmp=BitmapFactory.decodeFile(“file:///data/data/com.intuitiveui.android/files/facebook.ico"); 它返回null。嗨,我知道WebView的东西。在不起作用的地方读书。谢谢@Shimon Shnitzer-也许问题在于如何处理文件,而不是解码数据。如果使用
      Bitmap bmp=BitmapFactory.decodeStream(openFileInput(“facebook.ico”)现在唯一不起作用的是,对于某些网站,我的代码可以找到ICO文件信息,而对于某些网站,我的代码不能找到ICO文件信息。例如,如果我尝试www.facebook.com,我可以找到“快捷图标”字段并从那里读取ICO位置(您可以通过在PC上浏览www.facebook.com来尝试,然后查看html源代码)。对于其他网站-例如www.google.com-我根本找不到“快捷图标”字段…默认情况下,Favicon位于/Favicon.ico-例如,谢谢。我也是这么想的。但后来我看到了WebView界面,所以我想试试。