出现Immutable bitmap passed to Canvas constructor

来源:互联网 发布:mac软件可以移动吗? 编辑:程序博客网 时间:2024/06/13 00:27

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。。。。。。        }



出现crash
AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: android.uiAndroidRuntime: java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructorAndroidRuntime: 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 VMAndroidRuntime: 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了。



0 0