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 ...

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á :)


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

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


¡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


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.


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


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.