出现Immutable bitmap passed to Canvas constructor

本文介绍了一个关于在Android应用中使用不可变Bitmap时出现的崩溃问题及其解决方案。当尝试将不可变的Bitmap传递给Canvas构造函数时,会触发异常。文章详细解释了错误发生的原因,并提供了一种通过复制Bitmap来避免该问题的有效方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.youkuaiyun.com/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了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值