2012-05-18 28 views
6

He intentado obtener la imagen de mapa de bits de la ruta de acceso de la imagen. Pero BitmapFactory.decodeStream devuelve null valor.Android: bitmapfactory.decodestream devuelve nulo

Código:

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

He buscado en más sitios, todavía no conseguí la solución.

+0

¿estás seguro de que el punto url a algo que podría decodificar BitmapFacotry? – Blackbelt

+0

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

+2

hay un error BitmapFactory.decodeStream(). En lugar de decodeStream, intente guardar la imagen en sd, por ejemplo, y luego cárguela a través de BitmpaFoctory o lea esto: http://android-developers.blogspot.it/2010/07/multithreading-for-performance.html – Blackbelt

Respuesta

14

Qué soluciones: -)

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

El problema era que una vez que haya utilizado una insumos Tream desde una HttpUrlConnection, no puede rebobinar y usar el mismo InputStream nuevamente. Por lo tanto, debe crear un nuevo InputStream para el muestreo real de la imagen. De lo contrario, debemos abortar la solicitud http.

+0

¿Qué hay de diferente en esta solución al problema descrito? En ambos, veo que usa la transmisión solo una vez – Guy

+4

@Guy: solo cuando podamos usar inputstream para httprequest, si está intentando descargar otra imagen, arrojará un error como "InputStream ya creado" de esta manera. entonces debemos abortar la httprequest una vez descargada usando httpRequest.abort(); – Ponmalar

+0

Gracias. Agradezco tu respuesta – Guy

0

usando el siguiente código iam capaz de descargar una imagen de la 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

desde su código lo "baf" significa? – Ponmalar

+0

ByteArrayBuffer baf = new ByteArrayBuffer (1024); – user1203673

+0

Aquí también estoy obteniendo nulo – 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; 
} 

No se olvide de llamar a esto dentro de un hilo (no hilo principal)

+0

Gracias por su código ... – Ponmalar

0

BufferedInputStream es necesario antes de decodestream ....

Prueba esto funciona perfecto para mí utilizo;

BufferedInputStream buf = new BufferedInputStream(inputsteam, 1024);

Pass buf para decodificar corriente que funcione a la perfección.

Bitmap theImage = BitmapFactory.decodeStream(buf);

Finalmente configurar su mapa de bits.

0

Tuve el mismo problema, pero en mi caso el problema era el recurso (imagen). Asegúrese de que la imagen no esté en modo de color CMYK, ya que Android no admite imágenes CMYK. Ver this question para más detalles

Buena suerte;)

Cuestiones relacionadas