使用inJustDecodeBounds = true的OutOfMemory解码图像

时间:2013-01-15 09:57:19

标签: java android image android-camera out-of-memory

在我的Android应用中,我不断尝试解码来自相机的图像的OutOfMemory异常。处理这个问题有很多问题,但我的情况特别奇怪,因为即使只是试图获得options.inJustDecodeBounds=true的界限,我也会得到异常。

以下是启动相机的代码:

protected void takePicture() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File image = new File(IMAGE_PATH, "camera.jpg");
    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image));
    startActivityForResult(takePictureIntent, 0);
}

以下是触发异常的代码:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK ) { 
        String rawImageName = new String(IMAGE_PATH + "/camera.jpg");

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(rawImageName); // The exception is thrown here
            .
            .
            .
    }
}

我尝试使用非常高的采样率解码图像,但我仍然得到相同的例外:

options.inSampleSize = 20;
options.inJustDecodeBounds = false;
options.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap photo = BitmapFactory.decodeFile(rawImageName); // Again the exception

除此之外,应用程序似乎运行正常并且有足够的可用内存。我可以在图库应用中正确打开图像。将图像移动到另一个目录没有帮助。什么可能导致它的想法?使用inJustDecodeBounds = true进行解码时可能导致异常的原因是什么?

2 个答案:

答案 0 :(得分:10)

您需要将选项传递给解码调用:

BitmapFactory.decodeFile(rawImageName, options);

答案 1 :(得分:2)

BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = 4; // 1/4
o2.inPurgeable = true;
Bitmap b=BitmapFactory.decodeFile(imagePath,o2);

试试这个。还可以调整图像大小,并在使用后使位图对象为null。 给System.gc();打电话,它没有打电话给gc,但它给出了提示。 也没有很多位图对象。重用相同的位图对象,并在使用后将其设为null。