Crop Activity 引发的 android.os.TransactionTooLargeException

3

我有一个应用程序,用户可以上传一个图片作为他们的用户资料照片。在我的应用程序中,我允许用户使用原生裁剪器来裁剪图像。然而,当我尝试裁剪一张大图像时,我的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);

我猜测问题出在裁剪器试图将一个大位图作为可包含的数据类型返回给我的活动。是否有任何解决办法?或者其他获取裁剪后图片的替代方案?

感谢您提前提供的任何帮助。

1个回答

5
如果有人遇到这个问题,我已经通过以下链接解决了它:http://www.androidworks.com/crop_large_photos_with_android。我通过实施链接中的第二种选项解决了这个问题。
正如我最初怀疑的那样,问题是将大的位图作为可包含对象从裁剪器发送回来。相反,我所做的(就像链接建议的那样)是将裁剪器的内容保存到一个临时文件中,然后在我的主活动/片段中读取该内容。为了不通过可包含对象发送内容,我对上面的代码进行了主要更改。
cropIntent.putExtra("return-data", false);

并且添加了

cropIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempURI);

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

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

你需要一些代码来读取临时文件的内容。

希望这能帮到遇到这个问题的人。

编辑: 链接已失效,请尝试使用Internet Archive代替。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接