2012-05-18 18 views
6

Ho cercato di ottenere l'immagine bitmap dal percorso dell'immagine. Ma BitmapFactory.decodeStream restituisce il valore null.Android: bitmapfactory.decodestream restituisce null

Codice:

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

Ho cercato in più siti, ancora non ho avuto la soluzione.

+0

sei sicuro che il punto di URL a qualcosa che BitmapFacotry potrebbe decodificare? – Blackbelt

+0

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

+2

c'è un errore BitmapFactory.decodeStream(). Invece di decodeStream prova a salvare l'immagine su sd, per esempio e poi caricala attraverso BitmpaFoctory o leggi questo: http://android-developers.blogspot.it/2010/07/multithreading-for-performance.html – Blackbelt

risposta

14

Hai una soluzione: -)

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

Il problema era che, una volta che hai usato un ingressi tream da HttpUrlConnection, non è possibile riavvolgere e utilizzare di nuovo lo stesso InputStream. Pertanto è necessario creare un nuovo InputStream per il campionamento effettivo dell'immagine. Altrimenti dobbiamo abortire la richiesta http.

+0

Cosa c'è di diverso in questa soluzione al problema descritto? In entrambi vedo che utilizzi lo stream solo una volta – Guy

+4

@Guy: Solo una volta che possiamo utilizzare inputstream per httprequest, se stai provando a scaricare un'altra immagine, verrà generato un errore come "InputStream già creato" in questo modo. quindi abbiamo bisogno di abortire il httprequest una volta scaricato usando httpRequest.abort(); – Ponmalar

+0

Grazie. Apprezzo la tua risposta. – Guy

0

utilizzando il seguente codice iam in grado di scaricare un'immagine dall'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

dal tuo codice cosa "baf" significa? – Ponmalar

+0

ByteArrayBuffer baf = new ByteArrayBuffer (1024); – user1203673

+0

Anche qui sto diventando nullo – 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; 
} 

Non dimenticate di chiamare questo all'interno di un thread (non thread principale)

+0

Grazie per il codice ... – Ponmalar

0

BufferedInputStream è necessario prima che decodestream ....

Prova questo funziona perfetto per me usare;

BufferedInputStream buf = new BufferedInputStream(inputsteam, 1024);

Passo buf per decodificare streaming funziona perfettamente.

Bitmap theImage = BitmapFactory.decodeStream(buf);

Infine impostare il proprio bitmap.

0

Ho avuto lo stesso problema ma nel mio caso il problema era la risorsa (immagine). Assicurati che l'immagine non sia in modalità colore CMYK poiché Android non supporta le immagini CMYK. Vedere this question per maggiori dettagli

Buona fortuna;)

Problemi correlati