Transacción de carpeta fallida al colocar un mapa de bits de forma dinámica en un widget

116

¿Alguien puede decirme el motivo del error de transacción fallida de la carpeta ? Puedo ver este mensaje de error en logcat. Recibo este error al intentar poner un mapa de bits de forma dinámica en un widget ...

Eby
fuente

Respuestas:

91

Esto se debe a que todos los cambios en los RemoteViews se serializan (por ejemplo, setInt y setImageViewBitmap). Los mapas de bits también se serializan en un paquete interno. Desafortunadamente, este paquete tiene un límite de tamaño muy pequeño.

Puede resolverlo reduciendo el tamaño de la imagen de esta manera:

 public static Bitmap scaleDownBitmap(Bitmap photo, int newHeight, Context context) {

 final float densityMultiplier = context.getResources().getDisplayMetrics().density;        

 int h= (int) (newHeight*densityMultiplier);
 int w= (int) (h * photo.getWidth()/((double) photo.getHeight()));

 photo=Bitmap.createScaledBitmap(photo, w, h, true);

 return photo;
 }

Elija newHeight para que sea lo suficientemente pequeño (~ 100 por cada cuadrado que debería tomar en la pantalla) y utilícelo para su widget, y su problema se resolverá :)

GalDude33
fuente
1
Lo que no entiendo del todo es qué sucede aquí exactamente. Estoy usando un ViewPager con un conjunto de datos bastante grande, pero recuerda todo entre páginas a pesar del spam de error de carpeta. ¿El paquete se escribe en el almacenamiento local y luego se obtiene previamente o qué? ¿Puedo perder datos si agrego más páginas?
G_V
7
Pero esto reducirá la calidad de la imagen
John Joe
64

Puede comprimir el mapa de bits como una matriz de bytes y luego descomprimirlo en otra actividad, como esta.

¡¡Comprimir!!

        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
        byte[] bytes = stream.toByteArray(); 
        setresult.putExtra("BMP",bytes);

Descomprimir !!

        byte[] bytes = data.getByteArrayExtra("BMP");
        Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
Nicolás Loaiza
fuente
1
Perfecto, esto reduce significativamente el tamaño del mapa de bits.
Navin
1
¿Por qué no utilizar JPEG en lugar de PNG? ¿No está mejor comprimido?
mehmet6parmak
3
@ mehmet6parmak PNG se utiliza porque no tiene pérdidas, a diferencia de JPEG. Sí, JPEG se comprime mejor, pero la calidad (algo) sufre como resultado.
Petzku
no funciona para mí :( stackoverflow.com/questions/34540819/…
John Joe
¡Prestigio! Gran solución para una implementación temporal en la que estaba trabajando. Aunque se debe evitar pasar datos pesados ​​mientras se utilizan Bundles / Intents.
sud007
37

El búfer de transacciones de Binder tiene un tamaño fijo limitado, actualmente 1 Mb, que es compartido por todas las transacciones en curso para el proceso. En consecuencia, esta excepción se puede lanzar cuando hay muchas transacciones en curso, incluso cuando la mayoría de las transacciones individuales son de tamaño moderado.

referir este enlace

Dharam
fuente
12

Vea mi respuesta en este hilo.

intent.putExtra("Some string",very_large_obj_for_binder_buffer);

Está excediendo el búfer de transacciones de la carpeta al transferir elementos grandes de una actividad a otra.

Balaji Dubey
fuente
Tuve el mismo problema, simplemente eliminé el problema putExtra solucionado.
Ivor
8

Resolví este problema almacenando imágenes en el almacenamiento interno y luego usando .setImageURI () en lugar de .setBitmap ().

MartinC
fuente
1
y no pase las imágenes a través de Parcelable de pantalla a pantalla, supongo que eso es peor en este caso
MartinC
3

El enfoque correcto es usar setImageViewUri()(más lento) o setImageViewBitmap()y recrear RemoteViewlos mensajes de correo electrónico cada vez que actualice la notificación.

Alejandro Woodblock
fuente