2012-10-29 1 views
55
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) 

私は、デベロッパーコンソールからこのクラッシュエラーを取得..私は問題が何であるかを理解していません。..不変ビットマップクラッシュエラー

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); 

私はそれは、これに関連すると思いますか?

答えて

163

Canvasを描画するには、workingBitmapMutable Bitmapに変換する必要があります。 (注:この方法は、メモリを節約しません、それは余分なメモリを使用します)

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

この答えはあなたがこれをチェックアウトすることができ、メモリ使用量を最小限にするために、メモリ Convert immutable bitmap to a mutable bitmap

+0

このメソッドはメモリを節約するのに役立ちます。変更可能なビットマップ – dimetil

+0

を行う最も簡単な方法で答えを編集したところ、アプリケーションがクラッシュし、logcatにキャンバスがリサイクルされたビットマップを使用できないというメッセージが表示されます –

+0

Nvm私のコメントatm、役職。ありがとう –

30

BitmapFactory.decodeResource()は、ビットマップの不変のコピーを返し、あなたはに描くことができませんそのキャンバス。そのキャンバスを取得するには、画像のビットマップのコピーを変更する必要があります。これは、1行のコードを追加して行うことができます。

opt.inMutable = true; 

この行をコードに追加すると、クラッシュに対処する必要があります。あなたは可変ビットマップへのごIMMUTABLEビットマップを作成したくない場合を除き、私はこれをすることによってビットマップが可変することと同じかもしれないと思うしかし

+2

Bitmap.copy(...)を使用している場合にはメモリを消費しないため、これが答えになるはずです。 – java

+0

Bitmapプロパティを確認し、ビットマップをメモリにロードする前に設定することが不可欠です。メモリが問題の場合はこの回答を使用します。大きな次元のビットマップを使用している場合は特にそうです。 – Thracian

0

、あなたは常にBITMAP

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

を再利用ことでメモリを節約することができます

workingBitmap.isMutable = true