具有裁剪活动的android.os.TransactionTooLargeException

我有一个应用程序,用户可以上传其用户配置文件的图像.在我的应用程序中,我允许用户使用本机裁剪器裁剪图像.但是当我尝试裁剪大图像时,我的Logcat中出现以下错误:

!!! FAILED BINDER TRANSACTION !!!
Exception when starting activity com.example.somename/com.example.somename.Profile
android.os.TransactionTooLargeException

我使用以下代码启动裁剪器:

Intent cropIntent = new Intent("com.android.camera.action.CROP"); 
cropIntent.setDataAndType(imageFileUri , "image/*");
cropIntent.putExtra("crop", "true");
cropIntent.putExtra("aspectX", 1);
cropIntent.putExtra("aspectY", 1);
cropIntent.putExtra("outputX", 265);
cropIntent.putExtra("outputY", 265);
cropIntent.putExtra("scale", true);
cropIntent.putExtra("return-data", true);
startActivityForResult(cropIntent, PIC_CROP);

然后在我的onActivityResult中,以下代码获取裁剪后的图像:

Bundle extras = data.getExtras();
Bitmap selectedBitmap = extras.getParcelable("data");
imgDisplayPic.setImageBitmap(selectedBitmap);

我假设问题在于裁剪器试图将一个大位图发送为我的活动的parcelable.有没有办法解决?或者另一种获得裁剪图像的方法?

在此先感谢您的帮助.

解决方法:

如果其他人遇到这个问题我已经设法通过以下链接解决了它:http://www.androidworks.com/crop_large_photos_with_android.我通过实现链接中的选项#2解决了这个问题.

正如我原先怀疑的那样,问题是将一个大的位图从裁剪器发回作为一个可分配的.相反,我所做的(如链接所示)是将裁剪器的内容保存到临时文件中,然后在我的主活动/片段中读取该内容.为了不通过parcelable发回内容,我必须对上面的代码进行的主要更改是

cropIntent.putExtra("return-data", false);

并补充说

cropIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempURI);

其中“tempURI”是临时文件的Uri,其中将保存裁剪器的内容.然后在onActivityResult中,您需要删除以下行

Bitmap selectedBitmap = extras.getParcelable("data");

相反,您需要一些代码来读取临时文件中的内容.

希望这有助于任何遇到此问题的人.

编辑:
链接已死,请尝试Internet Archive.

上一篇:c – 使用Leptonica API裁剪图片 – >或者使用哪个图像处理库?


下一篇:OpenCV中cv2的用法