BitmapFactory.decodeStream devuelve siempre null y decodificador skia muestra decodificar devuelto falso

prueba la imagen aquí: http://images.plurk.com/tn_4134189_bf54fe8e270ce41240d534b5133884ee.gif

He intentado varias soluciones encontradas en el Internet pero no hay ninguna solución de trabajo.

Estoy utilizando el siguiente código de fragmento:

Url imageUrl = new Url("http://images.plurk.com/tn_4134189_bf54fe8e270ce41240d534b5133884ee.gif"); Bitmap image = BitmapFactory.decodeStream(imageUrl.openStream()); 

Siempre obteniendo este registro:

 DEBUG/skia(1441): --- decoder->decode returned false 

¿Alguna ayuda? Gracias.

EDITAR:

Estas imágenes no se pueden decodificar tampoco se pueden mostrar en un WebView . Pero puede ver si está abierto en un navegador.

Pruebe esto como una solución temporal:

Primero agregue la siguiente clase:

  public static class PlurkInputStream extends FilterInputStream { protected PlurkInputStream(InputStream in) { super(in); } @Override public int read(byte[] buffer, int offset, int count) throws IOException { int ret = super.read(buffer, offset, count); for ( int i = 2; i < buffer.length; i++ ) { if ( buffer[i - 2] == 0x2c && buffer[i - 1] == 0x05 && buffer[i] == 0 ) { buffer[i - 1] = 0; } } return ret; } } 

A continuación, envuelva su flujo original con PlurkInputStream:

 Bitmap bitmap = BitmapFactory.decodeStream(new PlurkInputStream(originalInputStream)); 

Déjeme saber si esto le ayuda.

EDITAR:

Lo siento, prueba la siguiente versión:

  for ( int i = 6; i < buffer.length - 4; i++ ) { if ( buffer[i] == 0x2c ) { if ( buffer[i + 2] == 0 && buffer[i + 1] > 0 && buffer[i + 1] <= 48 ) { buffer[i + 1] = 0; } if ( buffer[i + 4] == 0 && buffer[i + 3] > 0 && buffer[i + 3] <= 48 ) { buffer[i + 3] = 0; } } } 

Tenga en cuenta que este no es un código eficiente ni es una solución completa / correcta. Funcionará para la mayoría de los casos, pero no para todos.

Tuve el mismo problema, parcialmente fue arreglado por esta clase:

 static class FlushedInputStream extends FilterInputStream { public FlushedInputStream(InputStream inputStream) { super(inputStream); } @Override public long skip(long n) throws IOException { long totalBytesSkipped = 0L; while (totalBytesSkipped < n) { long bytesSkipped = in.skip(n - totalBytesSkipped); if (bytesSkipped == 0L) { int byte = read(); if (byte < 0) { break; // we reached EOF } else { bytesSkipped = 1; // we read one byte } } totalBytesSkipped += bytesSkipped; } return totalBytesSkipped; } 

}

Y:

 InputStream in = null; try { in = new java.net.URL(imageUrl).openStream(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } Bitmap image = BitmapFactory.decodeStream(new FlushedInputStream(in)); 

Ayudó en la mayoría de los casos, pero esto no es una solución universal. Para más refiérase a este bugreport .

¡La mejor de las suertes!

He probado todas las soluciones, pero no ha resuelto mi problema. Después de algunas pruebas, el problema de fallo decodificador skia sucedió mucho cuando la conexión a Internet no es estable. Para mí, forzar a volver a cargar la imagen resolvió el problema.

El problema también se presentó más cuando la imagen es de gran tamaño.

El uso de un bucle me requerirá como máximo dos intentos y la imagen se descargará correctamente.

 Bitmap bmp = null; int retries = 0; while(bmp == null){ if (retries == 2){ break; } bmp = GetBmpFromURL(String imageURL); Log.d(TAG,"Retry..."); retries++; } 

Esto debería funcionar:

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

myBitmap contiene su imagen.

esto se debe a un error en la clase InputStream en Android. Puede encontrar una solución válida y una descripción del error aquí http://code.google.com/p/android/issues/detail?id=6066

Por razones de memoria, debe implementar las opciones de BitmapFactory como esto:

 BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 4; // might try 8 also 

La función de mapa de bits de descarga principal tal vez como este:

 Bitmap downloadBitmap(String url) { final HttpClient client = AndroidHttpClient.newInstance("Android"); final HttpGet getRequest = new HttpGet(url); try { HttpResponse response = client.execute(getRequest); final int statusCode = response.getStatusLine().getStatusCode(); if (statusCode != HttpStatus.SC_OK) { if(DEBUG)Log.w("ImageDownloader", "Error " + statusCode + " while retrieving bitmap from " + url); return null; } final HttpEntity entity = response.getEntity(); if (entity != null) { InputStream inputStream = null; try { inputStream = entity.getContent(); BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 4; // might try 8 also return BitmapFactory.decodeStream(new FlushedInputStream(inputStream),null,options); } finally { if (inputStream != null) { inputStream.close(); } entity.consumeContent(); } } } catch (IOException e) { getRequest.abort(); if(DEBUG)Log.w(TAG, "I/O error while retrieving bitmap from " + url, e); } catch (IllegalStateException e) { getRequest.abort(); if(DEBUG)Log.w(TAG, "Incorrect URL: " + url); } catch (Exception e) { getRequest.abort(); if(DEBUG)Log.w(TAG, "Error while retrieving bitmap from " + url, e); } finally { if ((client instanceof AndroidHttpClient)) { ((AndroidHttpClient) client).close(); } } return null; } 

Y tal vez usted debe ser implementa AsyncTask como este: http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html

Para mí el problema es con el tipo de color de la imagen: su imagen está en color = CYMK no en RGB

Tal vez este no es su caso, pero podría ser si está tratando de decodificar imágenes con CMYK colorspace, en lugar de RGB colorspace. Las imágenes CMYK, como ésta , no son compatibles con Android, y no se mostrarán ni siquiera en el navegador web de Android. Lea más sobre esto aquí :

No se puede cargar la imagen JPEG con BitmapFactory.decodeFile. Devuelve null

Prueba esto:

 HttpGet httpRequest = new HttpGet(url); HttpClient httpclient = new DefaultHttpClient(); HttpResponse response = (HttpResponse) httpclient.execute(httpRequest); HttpEntity entity = response.getEntity(); BufferedHttpEntity bufferedHttpEntity = new BufferedHttpEntity(entity); InputStream is = bufferedHttpEntity.getContent(); Drawable d = Drawable.createFromStream(is, ""); //or bitmap //Bitmap b = BitmapFactory.decodeStream(is); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.