Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Failed binder transaction when putting an bitmap dynamically in a widget

Can anybody tell me the reason for failed binder transaction error? I can see this error message in logcat. I am getting this error while trying to put an bitmap dynamically in a widget...

like image 762
Eby Avatar asked Aug 20 '10 06:08

Eby


6 Answers

This is caused because all the changes to the RemoteViews are serialised (e.g. setInt and setImageViewBitmap ). The bitmaps are also serialised into an internal bundle. Unfortunately this bundle has a very small size limit.

You can solve it by scaling down the image size this way:

 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;
 }

Choose newHeight to be small enough (~100 for every square it should take on the screen) and use it for your widget, and your problem will be solved :)

like image 128
GalDude33 Avatar answered Oct 04 '22 22:10

GalDude33


You can compress the bitmap as an byte's array and then uncompress it in another activity, like this.

Compress!!

        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
        byte[] bytes = stream.toByteArray(); 
        setresult.putExtra("BMP",bytes);

Uncompress!!

        byte[] bytes = data.getByteArrayExtra("BMP");
        Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
like image 45
Nicolás Loaiza Avatar answered Oct 05 '22 00:10

Nicolás Loaiza


The Binder transaction buffer has a limited fixed size, currently 1Mb, which is shared by all transactions in progress for the process. Consequently this exception can be thrown when there are many transactions in progress even when most of the individual transactions are of moderate size.

refer this link

like image 24
dharam Avatar answered Oct 04 '22 23:10

dharam


See my answer in this thread.

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

You are exceeding the binder transaction buffer by transferring large element(s) from one activity to another activity.

like image 20
Balaji Dubey Avatar answered Oct 04 '22 23:10

Balaji Dubey


I have solved this issue by storing images on internal storage and then using .setImageURI() rather than .setBitmap().

like image 36
MartinC Avatar answered Oct 05 '22 00:10

MartinC


The right approach is to use setImageViewUri() (slower) or the setImageViewBitmap() and recreating RemoteViews every time you update the notification.

like image 23
Alexander Woodblock Avatar answered Oct 04 '22 22:10

Alexander Woodblock