java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor
at android.graphics.Canvas.<init>(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)
Ich erhalte diesen Absturzfehler von der Entwicklerkonsole. Ich verstehe nicht, wo das Problem liegt.
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);
Ich denke, es hängt damit zusammen?
BitmapFactory.decodeResource()
Gibt eine unveränderliche Kopie der Bitmap zurück und Sie können nicht auf die Zeichenfläche zeichnen. Um die Zeichenfläche zu erhalten, benötigen Sie eine veränderbare Kopie der Bitmap der Bilder. Dies kann durch Hinzufügen eines einzeiligen Codes erfolgen.opt.inMutable = true;
Fügen Sie diese Zeile Ihrem Code hinzu und sie sollte den Absturz beheben.
quelle
Das funktioniert auch, ich habe es gerade getestet.
final BitmapFactory.Options options = new BitmapFactory.Options(); options.inMutable = true; return BitmapFactory.decodeByteArray(resultDecoded, 0, resultDecoded.length,options);
quelle
Sofern Sie Ihre IMMUTABLE-Bitmap nicht in MUTABLE-Bitmap umwandeln möchten, können Sie Speicher sparen, indem Sie die BITMAP IMMER WIEDER VERWENDEN
workingBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true); Canvas canvas = new Canvas(workingBitmap);
Ich denke jedoch, dass dies dasselbe sein kann, als würde man die Bitmap durch Aufrufen veränderbar machen
workingBitmap.isMutable = true
quelle
Um die Speichernutzung zu minimieren, können Sie diesen Beitrag zum Konvertieren / Dekodieren einer veränderlichen Bitmap direkt aus den Ressourcen lesen:
https://stackoverflow.com/a/16314940/878126
quelle