Immutable bitmap passed to Canvas constructor
操作bitmap出现crash.
上code:
private void setBluredBackground(View root) {
WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
DisplayMetrics displayMetrics = new DisplayMetrics();
DisplayInfo info = new DisplayInfo();
display.getRealMetrics(displayMetrics);
display.getDisplayInfo(info);
Bitmap bitmap;
bitmap = FastBlur.takeScreenshot(display, displayMetrics, info).copy(Bitmap.Config.ARGB_8888, true);
Drawable drawable = null;
Canvas canvas = null;
if (bitmap == null) {
WallpaperManager wpm = WallpaperManager.getInstance(mContext);
drawable = wpm.getDrawable();
int w = (int)drawable.getIntrinsicWidth();
int h = (int)drawable.getIntrinsicHeight();
bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bitmap);
drawable.setBounds(0, 0, w, h);
drawable.draw(c);
wpm.forgetLoadedWallpaper();
c = null;
}
canvas = new Canvas(bitmap);
canvas.drawARGB(0xA0,0,0,0);
//略操作bitmap
。。。。。。
}
AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: android.ui
AndroidRuntime: java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor
AndroidRuntime: at android.graphics.Canvas.<init>(Canvas.java:131)
AndroidRuntime: at com.android.server.policy.GlobalActions$GlobalActionsIconDialog.setBluredBackground(GlobalActions.java:1585)
AndroidRuntime: at com.android.server.policy.GlobalActions$GlobalActionsIconDialog.onCreate(GlobalActions.java:1557)
AndroidRuntime: at android.app.Dialog.dispatchOnCreate(Dialog.java:395)
AndroidRuntime: at android.app.Dialog.show(Dialog.java:294)
AndroidRuntime: at com.android.server.policy.GlobalActions.cnHandleShow(GlobalActions.java:267)
AndroidRuntime: at com.android.server.policy.GlobalActions.showDialog(GlobalActions.java:211)
AndroidRuntime: at com.android.server.policy.PhoneWindowManager.showGlobalActionsInternal(PhoneWindowManager.java:1923)
AndroidRuntime: at com.android.server.policy.PhoneWindowManager.powerLongPress(PhoneWindowManager.java:1782)
AndroidRuntime: at com.android.server.policy.PhoneWindowManager.-wrap20(PhoneWindowManager.java)
AndroidRuntime: at com.android.server.policy.PhoneWindowManager$PolicyHandler.handleMessage(PhoneWindowManager.java:1098)
AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
AndroidRuntime: at android.os.Looper.loop(Looper.java:159)
AndroidRuntime: at android.os.HandlerThread.run(HandlerThread.java:61)
AndroidRuntime: at com.android.server.ServiceThread.run(ServiceThread.java:46)
AndroidRuntime: Shutting down VM
AndroidRuntime: FATAL EXCEPTION: main
原因是:
(引用 自 http://blog.csdn.net/gh102/article/details/6719624 )
出现Immutable bitmap passed to Canvas constructor错误的原因是如果不用copy的方法,直接引用会对资源文件进行修改,而Android是不允许在代码里修改res文件里的图片。
解决方案:
把
bitmap = FastBlur.takeScreenshot(display, displayMetrics, info);
改成:
bitmap = FastBlur.takeScreenshot(display, displayMetrics, info).copy(Bitmap.Config.ARGB_8888, true);
这样再运行这段code就没有出现crash了。