Quelqu'un peut-il me dire la raison de transaction de classeur ayant échoué erreur? Je peux voir ce message d'erreur dans logcat. Je reçois cette erreur en essayant de mettre une image bitmap dynamiquement dans un widget ...
Cela est dû au fait que toutes les modifications apportées à RemoteViews sont sérialisées (par exemple, setInt et setImageViewBitmap). Les bitmaps sont également sérialisés dans un ensemble interne. Malheureusement, ce paquet a une très petite taille limite.
Vous pouvez le résoudre en réduisant la taille de l’image de la manière suivante:
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;
}
Choisissez newHeight pour être assez petit (~ 100 pour chaque case à afficher à l'écran) et utilisez-le pour votre widget, et votre problème sera résolu :)
Vous pouvez compresser le bitmap en tant que tableau d'octets, puis le décompresser dans une autre activité, comme celle-ci.
Compresse!!
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] bytes = stream.toByteArray();
setresult.putExtra("BMP",bytes);
Décompressez !!
byte[] bytes = data.getByteArrayExtra("BMP");
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
Le tampon de transaction du classeur a une taille fixe limitée, actuellement de 1 Mo, partagée par toutes les transactions en cours du processus. Par conséquent, cette exception peut être levée lorsque plusieurs transactions sont en cours, même lorsque la plupart des transactions individuelles sont de taille modérée.
référez-vous ceci lien
Voir ma réponse dans this thread.
intent.putExtra("Some string",very_large_obj_for_binder_buffer);
Vous dépassez le tampon de transaction du classeur en transférant un ou plusieurs éléments volumineux d’une activité à une autre.
J'ai résolu ce problème en stockant des images sur la mémoire interne, puis en utilisant .setImageURI () plutôt que .setBitmap ().
La bonne approche consiste à utiliser setImageViewUri()
(plus lent) ou setImageViewBitmap()
et à recréer RemoteView
s chaque fois que vous mettez à jour la notification.