studio poner linearlayout layout_width examples ejemplo dinamico constraint como android android-layout

poner - layout dinamico android



Decodificador Android-> decodificación devuelto falso para descarga Bitmap (7)

Empecé a recibir un

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

problema en algunas imágenes de perfil de Facebook que uso en ImageViews. La mayoría funciona a la perfección, pero de vez en cuando descubro una que nunca funciona.

Estoy compilando mi aplicación contra Android 1.6 por razones de compatibilidad con versiones anteriores.

Hice algunas excavaciones y descubrí una serie de hilos sobre el tema. Ya estoy usando el FlushedInputStream que se trata aquí: http://code.google.com/p/android/issues/detail?id=6066

Bitmap b = BitmapFactory.decodeStream(new FlushedInputStream(is)); imageView.setImageBitmap(b);

Aquí hay un ejemplo que me está causando problemas: http://profile.ak.fbcdn.net/hprofile-ak-snc4/hs269.snc3/23132_639284607_390_q.jpg

¿Puede alguien mirar la imagen y ayudarme a descubrir qué está causando el problema?


Aquí hay una manera que funcionó para mí:

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


Aquí hay una manera que funcionó para mí:

public static Bitmap loadImageFromUrl(String url) { URL m; InputStream i = null; BufferedInputStream bis = null; ByteArrayOutputStream out =null; try { m = new URL(url); i = (InputStream) m.getContent(); bis = new BufferedInputStream(i,1024 * 8); out = new ByteArrayOutputStream(); int len=0; byte[] buffer = new byte[1024]; while((len = bis.read(buffer)) != -1){ out.write(buffer, 0, len); } out.close(); bis.close(); } catch (MalformedURLException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } byte[] data = out.toByteArray(); Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); //Drawable d = Drawable.createFromStream(i, "src"); return bitmap; }

Cargué la imagen por multihilo, y luego tuve que leer en bucle InputStream cuando el tiempo del hilo fue retenido por otro. Asegúrese de que inputStream se lea completamente.


El código fuente de este ImageDownloader.java es una buena orientación. Tiene una corrección de errores que resuelve el http://code.google.com/p/android/issues/detail?id=6066 proporcionando una clase FlushedInputStream parcheada.

Otra cosa de la que querrá ocuparse es ejecutar la decodificación en el mismo hilo que se ejecutó la solicitud HTTP:

@Override protected Bitmap doInBackground(String... url) { // execute HTTP GET request and decode response ... return bitmap } @Override protected void onPostExecute(Bitmap result) { imageView.setImageBitmap(result); }

Había hecho la decodificación en onPostExecute() , que se ejecuta en el hilo de la interfaz de usuario, y ya no funcionaba, y me daba el mismo error.


Este es el problema para mí:

Desde el emulador, guardaría el archivo jpg localmente (en la tarjeta sd emulada) y luego intentaría leerlo y mostrarlo usando decodificación en el emulador y funcionó. Luego, como prueba, copié el archivo (usando adb pull) a mi máquina de desarrollo (xp) y se mostraba usando ''paint''. Luego, desde el emulador, cargué el archivo (a través de http post) en mi servidor win2003. Usando ''pintura'' se muestra allí también. Pero cuando lo descargué de vuelta al emulador (a través de http get), falló durante la decodificación.

Luego noté que el archivo cargado en el servidor win2003 era dos bytes más pequeño que el original. No estoy totalmente seguro de cómo sucedió eso porque he estado usando la misma lógica de carga durante años y nunca antes había notado el problema. Como prueba, simplemente anexé dos bytes aleatorios más durante la carga, por lo que el tamaño del archivo fue exactamente el mismo. Luego, cuando se volvió a descargar al emulador, se decodificó y se mostró correctamente.

Solo como un cheque, añadí dos bytes aleatorios en mis proyectos xcode y luego esos archivos jpg también se muestran también en el emulador de Android.

Por lo tanto, aunque los archivos que eran dos bytes más pequeños se muestran en cualquier otro lugar, no aparecerían en el emulador. Aparentemente la decodificación está haciendo algún tipo de CRC antes de que intente descifrar y decida que no puede continuar. Y de ahí el error.


Hay un error en FlushedInputStream (es). falla en conexiones lentas pero puedes probar mi código mágico para arreglarlo.

Bitmap b = BitmapFactory.decodeStream(new FlushedInputStream(is)); imageView.setImageBitmap(b);

crea una clase estática fuera de tu método

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 b = read(); if (b < 0) { break; // we reached EOF } else { bytesSkipped = 1; // we read one byte } } totalBytesSkipped += bytesSkipped; } return totalBytesSkipped; } }

y aquí tienes ... ahora no tendrás ningún problema.



Otros que enfrentan problemas en Android KitKat 4.4, a continuación, serían útiles

Bitmap b = BitmapFactory.decodeStream(new BufferedInputStream(is)); imageView.setImageBitmap(b);

Estaba enfrentando este problema en la serie Nexus Después de actualizar a 4.4.