将位图动态放入窗口小部件时,绑定器事务失败

Eby*_*Eby 115 android bitmap widget

有人能告诉我粘合剂交易失败的原因吗?我可以在logcat中看到此错误消息.我试图在一个小部件中动态放置一个位图时收到此错误...

Gal*_*e33 90

这是因为对RemoteViews的所有更改都是序列化的(例如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;
 }
Run Code Online (Sandbox Code Playgroud)

选择newHeight足够小(对于它应该在屏幕上占据的每个方格约为100)并将其用于您的小部件,您的问题将得到解决:)

  • 但这会降低图像质量 (6认同)

小智 62

您可以将位图压缩为字节数组,然后在另一个活动中将其解压缩,如下所示.

压缩!!

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

解压!

        byte[] bytes = data.getByteArrayExtra("BMP");
        Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
Run Code Online (Sandbox Code Playgroud)

  • @ mehmet6parmak使用PNG是因为它不像JPEG那样是无损的.是的,JPEG压缩效果更好,但质量(有些)因此受到影响. (3认同)

dha*_*ram 37

Binder事务缓冲区具有有限的固定大小,当前为1Mb,由进程正在进行的所有事务共享.因此,即使大多数单个事务的大小适中,当有许多事务正在进行时,也会抛出此异常.

请参阅此链接


小智 12

这个 帖子中查看我的答案.

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

通过将大型元素从一个活动转移到另一个活动,您超过了活页夹事务缓冲区.


Mar*_*inC 8

我已经通过将图像存储在内部存储上然后使用.setImageURI()而不是.setBitmap()来解决了这个问题.