出现Immutable bitmap passed to Canvas constructor

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.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了。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值