Antworten:
Dies liegt daran, dass alle Änderungen an den RemoteViews serialisiert werden (z. B. setInt und setImageViewBitmap). Die Bitmaps werden auch in ein internes Bundle serialisiert. Leider hat dieses Bundle eine sehr kleine Größenbeschränkung.
Sie können das Problem lösen, indem Sie die Bildgröße folgendermaßen verkleinern:
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;
}
Wählen Sie newHeight, um klein genug zu sein (~ 100 für jedes Quadrat, das auf dem Bildschirm angezeigt werden soll), und verwenden Sie es für Ihr Widget, damit Ihr Problem gelöst wird :)
Sie können die Bitmap als Byte-Array komprimieren und dann in einer anderen Aktivität wie dieser dekomprimieren.
Kompresse!!
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] bytes = stream.toByteArray();
setresult.putExtra("BMP",bytes);
Dekomprimieren !!
byte[] bytes = data.getByteArrayExtra("BMP");
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
Der Binder-Transaktionspuffer hat eine begrenzte feste Größe, derzeit 1 MB, die von allen für den Prozess laufenden Transaktionen gemeinsam genutzt wird. Folglich kann diese Ausnahme ausgelöst werden, wenn viele Transaktionen ausgeführt werden, selbst wenn die meisten einzelnen Transaktionen von mäßiger Größe sind.
Verweisen Sie auf diesen Link
Siehe meine Antwort in diesem Thread.
intent.putExtra("Some string",very_large_obj_for_binder_buffer);
Sie überschreiten den Binder-Transaktionspuffer, indem Sie große Elemente von einer Aktivität zu einer anderen Aktivität übertragen.
Ich habe dieses Problem gelöst, indem ich Bilder im internen Speicher gespeichert und dann .setImageURI () anstelle von .setBitmap () verwendet habe.
Der richtige Ansatz besteht darin, jedes Mal, wenn Sie die Benachrichtigung aktualisieren, setImageViewUri()
(langsamer) oder das setImageViewBitmap()
und neu zu RemoteView
erstellen.