【发布时间】:2018-03-21 05:32:02
【问题描述】:
Android 应用在使用相机拍照后尝试使用内容解析器将图像保存到 sqlite 数据库。
但是,无论我做什么,我仍然会收到“无法压缩回收的位图”的变体
我查看了很多关于 stackoverflow 的帖子,但没有一篇能解决我的问题。我似乎找不到导致错误的位图被回收的代码:
Caused by: java.lang.IllegalStateException: Can't compress a recycled bitmap
at android.graphics.Bitmap.checkRecycled(Bitmap.java:394)
at android.graphics.Bitmap.compress(Bitmap.java:1077)
at com.wernerraubenheimer.ujcp.fragments.UserInputFragment.getBytes(UserInputFragment.java:269)
at com.wernerraubenheimer.ujcp.fragments.UserInputFragment.saveImage(UserInputFragment.java:248)
at com.wernerraubenheimer.ujcp.fragments.UserInputFragment.onActivityResult(UserInputFragment.java:241)
我的代码:
private void takePhotoFromCamera() {
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, CAMERA);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == getActivity().RESULT_CANCELED) {
return;
}
if (requestCode == GALLERY) {
if (data != null) {
Uri contentURI = data.getData();
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), contentURI);
saveImage(bitmap);
CircleTransform circleTransform = new CircleTransform();
avatarView.setImageBitmap(circleTransform.transform(bitmap));
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(getActivity(), "Failed!", Toast.LENGTH_LONG).show();
}
}
} else if (requestCode == CAMERA) {
Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
CircleTransform circleTransform = new CircleTransform();
avatarView.setImageBitmap(circleTransform.transform(thumbnail));
saveImage(thumbnail);
}
}
public void saveImage(Bitmap myBitmap) {
ContentValues userValues = new ContentValues();
userValues.put(ProgrammeCourseContract.LearnersEntry.COLUMN_AVATAR, getBytes(myBitmap));
if(!HAS_AVATAR) {
userValues.put(ProgrammeCourseContract.LearnersEntry._ID, 1); // Only one user for now, future may include more
getActivity().getContentResolver().insert(
ProgrammeCourseContract.LearnersEntry.CONTENT_URI,
userValues);
} else { //there is already an avatar image, save the new one
getActivity().getContentResolver().update(
ProgrammeCourseContract.LearnersEntry.CONTENT_URI,
userValues,
ProgrammeCourseContract.LearnersEntry._ID + " = ?",
new String[]{"1"});
}
onAvatarUpdateListener.onAvatarUpdate();
}
// convert from bitmap to byte array
public static byte[] getBytes(Bitmap bitmap) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
return stream.toByteArray();
}
// convert from byte array to bitmap
public static Bitmap getImage(byte[] image) {
return BitmapFactory.decodeByteArray(image, 0, image.length);
}
【问题讨论】:
-
CircleTransform可能会回收您传递的Bitmap。您需要保留对从circleTransform.transform()返回的Bitmap的引用,并将其传递给您的saveImage()方法。例如:Bitmap newBmp = circleTransform.transform(thumbnail);、avatarView.setImageBitmap(newBmp);、saveImage(newBmp);。除非您不想保存转换后的Bitmap,在这种情况下,请先保存它,然后再将其传递给CircleTransform。 -
谢谢,这就是问题所在。将 saveImage(thumbnail) 移动到圆形变换之前,现在它可以正确保存。当我从图库中选择保存图像时,我实际上是这样做的。没想到会有所作为。
标签: android sqlite bitmap camera