将相机图像作为位图传递 Returns TransactionTooLarge 异常

Passing a Camera Image as Bitmap Returns TransactionTooLarge Exception

我正在为我的应用程序使用相机套件库。当我得到图片回调时,我将字节数组转换为位图并尝试将其传递给下一个activity,如下所示:

ab_capture.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            cameraView.captureImage(new CameraKitEventCallback<CameraKitImage>() {
                @Override
                public void callback(CameraKitImage cameraKitImage) {
                    byte[] jpeg = cameraKitImage.getJpeg();

                    Bitmap bitmap = BitmapFactory.decodeByteArray(jpeg, 0, jpeg.length);
                    Intent previewIntent = new Intent(ImageActivity.this, PreviewActivity.class);
                    previewIntent.putExtra("cam_image", bitmap);
                    startActivity(previewIntent); // implicit
                    finish();

                }
            });
        }
    });

但在点击按钮后,应用程序崩溃并且我收到此错误消息:

E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!  (parcel size = 3686928)
02-28 01:03:06.183 9579-9999/base.android.com.thumbsapp E/AndroidRuntime: FATAL EXCEPTION: CameraViewWorker
                                                                      Process: base.android.com.thumbsapp, PID: 9579
                                                                      java.lang.RuntimeException: Failure from system
                                                                          at android.app.Instrumentation.execStartActivity(Instrumentation.java:1525)
                                                                          at android.app.Activity.startActivityForResult(Activity.java:4226)
                                                                          at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
                                                                          at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:67)
                                                                          at android.app.Activity.startActivityForResult(Activity.java:4185)
                                                                          at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:732)
                                                                          at android.app.Activity.startActivity(Activity.java:4509)
                                                                          at android.app.Activity.startActivity(Activity.java:4477)
                                                                          at base.android.com.thumbsapp.UI.Activities.ImageActivity.callback(ImageActivity.java:83)
                                                                          at base.android.com.thumbsapp.UI.Activities.ImageActivity.callback(ImageActivity.java:75)
                                                                          at com.wonderkiln.camerakit.CameraView.imageCaptured(CameraView.java:471)
                                                                          at com.wonderkiln.camerakit.Camera1.onPictureTaken(Camera1.java:427)
                                                                          at android.hardware.Camera$EventHandler.handleMessage(Camera.java:1361)
                                                                          at android.os.Handler.dispatchMessage(Handler.java:110)
                                                                          at android.os.Looper.loop(Looper.java:203)
                                                                          at android.os.HandlerThread.run(HandlerThread.java:61)
                                                                       Caused by: android.os.TransactionTooLargeException: data parcel size 3686928 bytes
                                                                          at android.os.BinderProxy.transactNative(Native Method)
                                                                          at android.os.BinderProxy.transact(Binder.java:622)
                                                                          at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3197)
                                                                          at android.app.Instrumentation.execStartActivity(Instrumentation.java:1518)
                                                                          at android.app.Activity.startActivityForResult(Activity.java:4226) 
                                                                          at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54) 
                                                                          at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:67) 
                                                                          at android.app.Activity.startActivityForResult(Activity.java:4185) 
                                                                          at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:732) 
                                                                          at android.app.Activity.startActivity(Activity.java:4509) 
                                                                          at android.app.Activity.startActivity(Activity.java:4477) 
                                                                          at base.android.com.thumbsapp.UI.Activities.ImageActivity.callback(ImageActivity.java:83) 
                                                                          at base.android.com.thumbsapp.UI.Activities.ImageActivity.callback(ImageActivity.java:75) 
                                                                          at com.wonderkiln.camerakit.CameraView.imageCaptured(CameraView.java:471) 
                                                                          at com.wonderkiln.camerakit.Camera1.onPictureTaken(Camera1.java:427) 
                                                                          at android.hardware.Camera$EventHandler.handleMessage(Camera.java:1361) 
                                                                          at android.os.Handler.dispatchMessage(Handler.java:110) 
                                                                          at android.os.Looper.loop(Looper.java:203) 
                                                                          at android.os.HandlerThread.run(HandlerThread.java:61) 

此错误仅发生在牛轧糖设备上。当我 运行 在 Lollipop 上时,没有错误,但它没有启动预览 activity。

我需要帮助来理解和解决这个错误以及进入下一个 activity 的问题。谢谢

This error only occurs on a Nougat device

它会在绝大多数 Android 设备上发生。

I need help understanding and resolving this error

您的 Intent 过大,因为 Bitmap 多余。

最好的解决办法是这里不要有两个活动。有一个 activity 具有变化 UI,例如通过使用片段。

或者,小心地通过static字段传递Bitmap,确保尽快将该字段设置为null,这样你没有 long-term 内存泄漏。

你永远不应该使用意图传递这个大数据。它会在大多数设备上崩溃并且设计不佳。

首先将文件存储到磁盘,然后将其路径放入 intent