Неизменяемая ошибка сбоя битмапа

java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor at android.graphics.Canvas.(Canvas.java:127) at app.test.canvas.StartActivity.applyFrame(StartActivity.java:214) at app.test.canvas.StartActivity$1.onClick(StartActivity.java:163) at android.view.View.performClick(View.java:4223) at android.view.View$PerformClick.run(View.java:17275) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4898) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) at dalvik.system.NativeStart.main(Native Method) 

Я получаю эту ошибку при сбое с консоли разработчика. Я не понимаю, в чем проблема.

  BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inScaled = true; opt.inPurgeable = true; opt.inInputShareable = true; Bitmap brightBitmap = BitmapFactory.decodeResource(getResources(), position, opt); brightBitmap = Bitmap.createScaledBitmap(brightBitmap, 550, 550, false); chosenFrame = brightBitmap; Bitmap workingBitmap = Bitmap.createBitmap(chosenFrame); workingBitmap = Bitmap.createBitmap(workingBitmap); Canvas c = new Canvas(workingBitmap); 

Я думаю, это связано с этим?

Вы должны преобразовать свой workingBitmap в Mutable Bitmap для рисования на Canvas . (Примечание: этот метод не помогает экономить память, он будет использовать дополнительную память)

 Bitmap workingBitmap = Bitmap.createBitmap(chosenFrame); Bitmap mutableBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true); Canvas canvas = new Canvas(mutableBitmap); 

Этот ответ помогает не тратить память. Преобразование неизменяемого растрового изображения в изменяемое bitmap

BitmapFactory.decodeResource() возвращает неизменяемую копию растрового изображения, и вы не можете рисовать его на canvasе. Чтобы получить свой canvas, вам нужно получить измененную копию растрового изображения изображений, и это можно сделать с добавлением однострочного кода.

 opt.inMutable = true; 

Добавьте эту строку в свой код, и он должен обратиться к сбою.

чтобы минимизировать использование памяти, вы можете проверить этот пост о преобразовании / расшифровке измененного битового массива прямо из ресурсов:

https://stackoverflow.com/a/16314940/878126

Если вы не хотите превращать IMMUTABLE bitmap в bitmap MUTABLE, вы можете сэкономить память, ВСЕГДА ИСПОЛЬЗУЙТЕ БИТМАП

 workingBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true); Canvas canvas = new Canvas(workingBitmap); 

Однако я думаю, что это может быть так же, как сделать bitmap изменчивым, вызвав

 workingBitmap.isMutable = true 
  • Android: наложение на просмотр камеры Android
  • Есть ли реальное решение для отладки приложений cordova
  • Как изменить цвет заголовка AlertDialog и цвет линии под ним
  • андроид, снимок экрана с экрана
  • Разделитель Android / разделитель линии в макете?
  • Расчет расстояния между двумя географическими точками
  • Как распечатать изображение на Bluetooth-принтере в Android?
  • Android реагирует на URL в намерении
  • Как сделать таймер обратного отсчета в Android?
  • Android устанавливает высоту и ширину пользовательского вида программно
  • Как загрузить большие изображения в Android и избежать ошибки из памяти?
  • Давайте будем гением компьютера.