Câu trả lời:
Điều này là do tất cả các thay đổi đối với RemoteViews được tuần tự hóa (ví dụ: setInt và setImageViewBitmap). Các bitmap cũng được tuần tự hóa thành một gói bên trong. Thật không may, gói này có giới hạn kích thước rất nhỏ.
Bạn có thể giải quyết nó bằng cách thu nhỏ kích thước hình ảnh theo cách này:
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;
}
Chọn newHeight đủ nhỏ (~ 100 cho mỗi hình vuông mà nó sẽ chiếm trên màn hình) và sử dụng nó cho widget của bạn, và vấn đề của bạn sẽ được giải quyết :)
Bạn có thể nén bitmap dưới dạng một mảng của byte và sau đó giải nén nó trong một hoạt động khác, như thế này.
Nén !!
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] bytes = stream.toByteArray();
setresult.putExtra("BMP",bytes);
Giải nén!!
byte[] bytes = data.getByteArrayExtra("BMP");
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
Bộ đệm giao dịch Binder có kích thước cố định hạn chế, hiện tại là 1Mb, được chia sẻ bởi tất cả các giao dịch đang diễn ra trong quy trình. Do đó, ngoại lệ này có thể bị loại bỏ khi có nhiều giao dịch đang diễn ra ngay cả khi hầu hết các giao dịch riêng lẻ có quy mô vừa phải.
tham khảo liên kết này
Xem câu trả lời của tôi trong chủ đề này .
intent.putExtra("Some string",very_large_obj_for_binder_buffer);
Bạn đang vượt quá bộ đệm giao dịch liên kết bằng cách chuyển (các) phần tử lớn từ hoạt động này sang hoạt động khác.
Cách tiếp cận đúng là sử dụng setImageViewUri()
(chậm hơn) hoặc setImageViewBitmap()
và tạo lại RemoteView
mỗi khi bạn cập nhật thông báo.