在我的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
进行解码时可能导致异常的原因是什么?
答案 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。