失敗したバインダートランザクションエラーの理由を教えてもらえますか?このエラーメッセージはlogcatで確認できます。ウィジェットにビットマップを動的に配置しようとするとこのエラーが発生します...
これは、RemoteViewへのすべての変更がシリアル化されるために発生します(例:setIntおよびsetImageViewBitmap)。ビットマップも内部バンドルにシリアル化されます。残念ながら、このバンドルには非常に小さなサイズ制限があります。
この方法で画像サイズを縮小することで解決できます:
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;
}
NewHeightを十分に小さくして(画面に表示する正方形ごとに最大100)、ウィジェットに使用すると、問題が解決します:)
ビットマップをバイトの配列として圧縮してから、次のように別のアクティビティで圧縮解除できます。
圧縮!!
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] bytes = stream.toByteArray();
setresult.putExtra("BMP",bytes);
解凍!!
byte[] bytes = data.getByteArrayExtra("BMP");
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
バインダトランザクションバッファの制限サイズは現在1Mbで、プロセスで進行中のすべてのトランザクションで共有されます。したがって、個々のトランザクションのほとんどが中程度のサイズであっても、進行中のトランザクションが多数ある場合、この例外がスローされる可能性があります。
これを参照してください link
this threadの私の答えをご覧ください。
intent.putExtra("Some string",very_large_obj_for_binder_buffer);
あるアクティビティから別のアクティビティに大きな要素を転送することにより、バインダートランザクションバッファを超えています。
内部ストレージに画像を保存し、.setBitmap()ではなく.setImageURI()を使用して、この問題を解決しました。
適切なアプローチは、通知を更新するたびにsetImageViewUri()
(遅い)またはsetImageViewBitmap()
を使用し、RemoteView
sを再作成することです。