2010-04-22 98 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
相關問題