2012-05-18 48 views
6

我試圖從圖像的路徑獲取位圖圖像。但BitmapFactory.decodeStream返回null值。Android:bitmapfactory.decodestream返回null

代碼:

URL url = new URL(path); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
connection.setDoInput(true); 
connection.connect(); 
InputStream input = connection.getInputStream(); 
Bitmap myBitmap = BitmapFactory.decodeStream(input); 
connection.disconnect(); 
input.close(); 

我已搜查在更多的網站,我仍然沒有得到解決。

+0

你確定該URL指向的東西,BitmapFacotry可以解碼? – Blackbelt

+0

是,網址:http://static.adzerk.net/Advertisers/12f0cc69cd9742faa9c8ee0f7b0d210e.jpg – Ponmalar

+2

有一個bug BitmapFactory.decodeStream()。比如decodeStream,請嘗試將圖像保存在sd上,然後通過BitmpaFoctory加載它,或者從代碼中讀取:http://android-developers.blogspot.it/2010/07/multithreading-for-performance.html – Blackbelt

回答

14

得到了一個解決方案: - )

HttpGet httpRequest = new HttpGet(URI.create(path)); 
HttpClient httpclient = new DefaultHttpClient(); 
HttpResponse response = (HttpResponse) httpclient.execute(httpRequest); 
HttpEntity entity = response.getEntity(); 
BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity); 
bmp = BitmapFactory.decodeStream(bufHttpEntity.getContent()); 
httpRequest.abort(); 

問題是,一旦你使用了InputS來自HttpUrlConnection的流,您不能倒帶並再次使用相同的InputStream。因此您必須爲圖像的實際採樣創建一個新的InputStream。否則,我們必須中止http請求。

+0

在解決這個問題時所描述的問題有什麼不同?在我看到你只使用一次流 – Guy

+4

@Guy:只有一次我們可以使用inputstream進行httprequest,如果你想下載另一個圖像,那麼它會拋出一個錯誤,就像這樣的「InputStream已經創建」。所以我們需要使用httpRequest.abort()來下載httprequest。 – Ponmalar

+0

謝謝。我很感謝你的回答。 – Guy

0

使用下面的代碼亞姆能夠從URL下載的圖像

String IMAGE_URL = "http://www.kolkatabirds.com/rainquail8vt.jpg"; 
      //where we want to download it from 
      URL url; 
      try { 
       url = new URL(IMAGE_URL); 

       //open the connection 
       URLConnection ucon = url.openConnection(); 

       //buffer the download 
       InputStream is = ucon.getInputStream(); 
       BufferedInputStream bis = new BufferedInputStream(is,1024); 

       //get the bytes one by one 
       int current = 0; 

       while ((current = bis.read()) != -1) { 
        baf.append((byte) current); 
       } 
       //convert it back to an image 
       ByteArrayInputStream imageStream = new ByteArrayInputStream(baf.toByteArray()); 
       Bitmap theImage = BitmapFactory.decodeStream(imageStream); 
       img.setImageBitmap(theImage); 
+0

「baf」是什麼意思? – Ponmalar

+0

ByteArrayBuffer baf = new ByteArrayBuffer(1024); – user1203673

+0

這裏我也得到null – Ponmalar

1
public Bitmap getBitmapFromUrl(String url) 
{ 
Bitmap bm = null; 
InputStream is = null; 
BufferedInputStream bis = null; 
try 
{ 
    URLConnection conn = new URL(url).openConnection(); 
    conn.connect(); 
    is = conn.getInputStream(); 
    bis = new BufferedInputStream(is, 8192); 
    bm = BitmapFactory.decodeStream(bis); 
} 
catch (Exception e) 
{ 
    e.printStackTrace(); 
} 
finally { 
    if (bis != null) 
    { 
     try 
     { 
      bis.close(); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
    if (is != null) 
    { 
     try 
     { 
      is.close(); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 
return bm; 
} 

不要忘了在一個線程中調用這個(沒有主線程)

+0

謝謝你的代碼... – Ponmalar

0

的BufferedInputStream是decodestream前必要....

試試這個,我用它完美的作品;

BufferedInputStream buf = new BufferedInputStream(inputsteam, 1024);

通行證BUF解碼流,它將會很好地工作。

Bitmap theImage = BitmapFactory.decodeStream(buf);

最後設置你的位圖。

0

我有同樣的問題,但在我的情況下,問題是資源(圖像)。請確保圖像不處於CMYK顏色模式,因爲Android不支持CMYK圖像。見this question更多細節

祝你好運;)