Transacción de encuadernación fallida al colocar un bitmap dinámicamente en un widget

¿Alguien puede decirme el motivo del error de transacción fallida del encuadernador ? Puedo ver este mensaje de error en logcat. Recibo este error al intentar poner un bitmap dinámicamente en un widget …

Esto se debe a que todos los cambios en las RemoteViews están serializados (por ejemplo, setInt y setImageViewBitmap). Los mapas de bits también se serializan en un paquete interno. Lamentablemente, 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 úselo para su widget, y su problema se resolverá 🙂

Puede comprimir el bitmap 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); 

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

referir este enlace

Ver mi respuesta en este hilo.

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

Está excediendo el búfer de transacción de la carpeta transfiriendo elementos grandes de una actividad a otra.

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

El enfoque correcto es usar setImageViewUri() (más lento) o setImageViewBitmap() y RemoteView s cada vez que actualice la notificación.