Відповіді:
Це викликано тим, що всі зміни в 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;
}
Оберіть newHeight, щоб він був досить маленьким (~ 100 на кожен квадрат, який він повинен займати на екрані) та використовуйте його для свого віджета, і ваша проблема буде вирішена :)
Ви можете стиснути растрову карту як масив байтів, а потім розпакувати її в іншій діяльності, як-от у цьому.
Стиснути !!
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);
Буфер транзакцій Binder має обмежений фіксований розмір, наразі 1 Мб, який поділяється на всі транзакції, що здійснюються в процесі. Отже, цей виняток може бути викинутий, коли проводиться багато транзакцій, навіть коли більшість окремих транзакцій мають середній розмір.
Дивіться мою відповідь у цій темі.
intent.putExtra("Some string",very_large_obj_for_binder_buffer);
Ви перевищуєте буфер транзакцій в'яжучого шляхом перенесення великих елементів (елементів) з однієї діяльності на іншу.
Правильний підхід полягає у використанні setImageViewUri()
(повільніше) або setImageViewBitmap()
відтворенні RemoteView
s кожного разу, коли ви оновлюєте сповіщення.