web-dev-qa-db-ja.com

ウィジェットにビットマップを動的に配置するときに失敗したバインダートランザクション

失敗したバインダートランザクションエラーの理由を教えてもらえますか?このエラーメッセージはlogcatで確認できます。ウィジェットにビットマップを動的に配置しようとするとこのエラーが発生します...

115
Eby

これは、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)、ウィジェットに使用すると、問題が解決します:)

90
GalDude33

ビットマップをバイトの配列として圧縮してから、次のように別のアクティビティで圧縮解除できます。

圧縮!!

        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);
62
Nicolás Loaiza

バインダトランザクションバッファの制限サイズは現在1Mbで、プロセスで進行中のすべてのトランザクションで共有されます。したがって、個々のトランザクションのほとんどが中程度のサイズであっても、進行中のトランザクションが多数ある場合、この例外がスローされる可能性があります。

これを参照してください link

37
dharam

this threadの私の答えをご覧ください。

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

あるアクティビティから別のアクティビティに大きな要素を転送することにより、バインダートランザクションバッファを超えています。

12
Balaji Dubey

内部ストレージに画像を保存し、.setBitmap()ではなく.setImageURI()を使用して、この問題を解決しました。

8
MartinC

適切なアプローチは、通知を更新するたびにsetImageViewUri()(遅い)またはsetImageViewBitmap()を使用し、RemoteViewsを再作成することです。

3