Android BitmapFactory.decodeFile能否处理.ICO(Windows图标)文件?
我在安卓上工作。试图显示“favicon”(又名“快捷图标”)或网页 因此,我已经有了从任何网站获取该图标URL的代码,并将其下载到我的Android上 现在我正试图用它制作位图,但结果总是为空 守则: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
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界面,所以我想试试。