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...
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 :)

- 7,071
- 1
- 28
- 38
-
1What I don't quite understand is what happens here exactly. I'm using a ViewPager with a fairly large dataset, yet it does remember everything between pages despite the binder error spam. Does the bundle get written to local storage and then prefetched or what? Can I possibly lose data if I add more pages? – G_V Dec 03 '14 at 08:18
-
7But this will reduce the image quality – John Joe Dec 31 '15 at 04:16
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);

- 1,015
- 11
- 11
-
1
-
1
-
3@mehmet6parmak PNG is used because it is lossless, unlike JPEG. Yes, JPEG compresses better, but the quality (somewhat) suffers as a result. – Petzku Jun 18 '15 at 08:39
-
doesn't work for me :( https://stackoverflow.com/questions/34540819/still-get-error-failed-binder-transaction-although-have-compressed-it – John Joe Dec 31 '15 at 04:11
-
Kudos! Great workaround for a temporary implementation I was working on. Although passing heavy data should be avoided while using Bundles/Intents. – sud007 Jul 28 '17 at 12:01
-
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

- 7,835
- 5
- 38
- 71
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.

- 1
- 1

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

- 546
- 11
- 26
-
1and don't pass the images through Parcelable from screen to screen or so, I guess that's worst in this case – MartinC Jun 05 '13 at 11:33
The right approach is to use setImageViewUri()
(slower) or the setImageViewBitmap()
and recreating RemoteView
s every time you update the notification.

- 1,539
- 24
- 35

- 497
- 9
- 31