【问题标题】:Android taking picture with camera and save to sqlite causes java.lang.IllegalStateException: Can't compress a recycled bitmapAndroid用相机拍照并保存到sqlite导致java.lang.IllegalStateException:无法压缩回收的位图
【发布时间】: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


【解决方案1】:

根据 Mike M,将 saveImage(thumbnail) 移到 CircleTransform 之前:

else if (requestCode == CAMERA) {
            Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
            saveImage(thumbnail);
            CircleTransform circleTransform = new CircleTransform();
            avatarView.setImageBitmap(circleTransform.transform(thumbnail));
        }

【讨论】:

    猜你喜欢
    • 2019-08-03
    • 1970-01-01
    • 2018-06-20
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多