2010-04-22 31 views
0

我正在使用Android。尝试显示“favicon”(又名“快捷图标”)或网页。BitmapFactory.decodeFile可以处理.ICO(Windows图标)文件吗?

因此,我已经有了从任何网站获取该图标的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

回答

4

这里是supported Android media formats的列表。 ICO不在其中。不过,你也许能够找到一个基于Java的ICO解码器。

+0

谢谢。这也是我的想法。但后来我看到了WebView界面,所以我想我会试试看。 – 2010-04-22 14:41:37

1

WebView component has a getFavicon() method所以它是绝对有可能解码在Android的ICO文件。你可以have a look at the Android source看看ICO文件是如何解析的。我已经快速浏览过,但找不到相关部分。

或者,您应该使用SDK来获取网页图标。不过,我已经尝试了一下并且无法使其工作。

对于它的价值,这里是我的测试代码,再一次指出,这不起作用

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。如果你确实得到这个工作,我会有兴趣听到你做了什么。

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

+0

嗨, 有趣的是 - 我设法使用:显示ICO文件: 位图bmp = BitmapFactory.decodeStream(in); 当in是一个HttpURLConnection的InputStream。 这会呈现ICO文件。但是当我尝试首先将ICO保存到文件时: 然后从(InputStream)中读入这个OutputStream, 我确实看到了一个文件facebook.ico的创建。 但是当我尝试拨打 位图bmp = BitmapFactory.decodeFile(“file:///data/data/com.intuitiveui.android/files/facebook.ico”); 它返回null。 – 2010-04-22 14:02:45

+0

嗨, 我知道WebView的东西。阅读某处不起作用。 谢谢! – 2010-04-22 14:22:58

+0

@Shimon Shnitzer - 也许问题是如何处理文件而不是解码数据。如果使用Bitmap bmp = BitmapFactory.decodeStream(openFileInput(“facebook.ico”));' – 2010-04-22 14:50:15

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)); 
2

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

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

0

没有公认的答案UTIL现在,我会在这里分享我的发现。

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

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

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

一个。icob.ico包含不同数量的图标。

我试图用BitmapFactory.decodeFile来解码这些图标。搭载Android 4.3

  • 两款Android设备只能解码a.ico,但b.ico不能解码
  • Android 4.4或更高版本的设备可以解码a.icob.ico

由于我只有有限的Android设备,我不能给出任何结论。也许任何人都可以帮忙。

所以,如果你真的想解码.ico文件,您可以尝试:

  • 与它只有1图像/图片
  • 写自己的.ICO解码器或第三个库如创建.ico文件image4j
相关问题