2012-05-18 29 views
6

Resim yolundan bitmap görüntüsünü almaya çalıştım. Ancak BitmapFactory.decodeStream, null değerini döndürür.Android: bitmapfactory.decodestream sıfır döndürüyor

Kodu:

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

Hala ben çözüm alamadım, daha sitelerinde aradık.

+0

Bir şey url noktası BitmapFacotry deşifre olabilir emin misin? – Blackbelt

+0

evet, URL: http://static.adzerk.net/Advertisers/12f0cc69cd9742faa9c8ee0f7b0d210e.jpg – Ponmalar

+2

bir hata var BitmapFactory.decodeStream(). DecodeStream yerine, örneğin görüntüyü sd kaydedin ve BitmpaFoctory üzerinden yükleyin veya okuyun: http://android-developers.blogspot.it/2010/07/multithreading-for-performance.html – Blackbelt

cevap

14

Çözüm var (değil ana iş parçacığı) bir iş parçacığı içinde bu aramayı unutma url bir görüntü indirmek mümkün iam Aşağıdaki kodu kullanarak: -)

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

sorun olduğunu bir girişler kullandıktan sonra Bir HttpUrlConnection'dan geldiğinizde, tekrar aynı InputStream kullanamazsınız. Bu nedenle, görüntünün gerçek örneklemesi için yeni bir InputStream oluşturmanız gerekir. Aksi takdirde, http talebini iptal etmek zorundayız.

+0

Bu çözümde açıklanan sorun ne farklı? Her ikisinde de sadece bir kere – Guy

+4

@Guy akışını kullanarak görüyorsunuz: httprequest için giriş akışını yalnızca bir kez kullanabilirsek, başka bir resim indirmeye çalışıyorsanız, bu şekilde "InputStream zaten oluşturulmuş" gibi bir hata atacaktır. httpRequest.abort() kullanarak indirdikten sonra httprequest'i iptal etmemiz gerekiyor; – Ponmalar

+0

Teşekkürler. Cevabını takdir ediyorum. – Guy

0

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

kodunuzdan ne "baf" demek? – Ponmalar

+0

ByteArrayBuffer baf = new ByteArrayBuffer (1024); – user1203673

+0

Burada ayrıca 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; 
} 

Dont

+0

Kodunuz için teşekkürler ... – Ponmalar

0

BufferedInputStream beni kullanmak için mükemmel çalışan bu deneyin ....

decodestream önce gereklidir;

BufferedInputStream buf = new BufferedInputStream(inputsteam, 1024);

Geçiş buf acağından akışa deşifre.

Bitmap theImage = BitmapFactory.decodeStream(buf);

Nihayet bit eşlem ayarlayın.

0

Aynı sorun vardı ama benim durumumda sorun kaynaktı (görüntü). Android CMYK görüntülerini desteklemediğinden, görüntünün CMYK renk modunda olmadığından emin olun. Daha fazla ayrıntı

İyi şanslar

için this question bakınız;)

İlgili konular