加载大位图时如何避免android中的内存不足错误?

时间:2014-07-03 00:20:04

标签: android bitmap out-of-memory

在android中,我从图像选择器打开一个位图,并将其加载到imageview中。如果用户选择大图像,则应用程序将崩溃。我尝试过try / catch,但它没有用。

有没有办法在将文件大小加载到位图之前检查文件大小?

这是代码:

这是我选择图像时的返回功能

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        ImageUploadHandler.handleResult(this, data);
    }
}

这是来自另一个文件

public void handleResult(Context context, Intent data) {
    Bitmap bitmap = null;

    try {
        bitmap = MyImage.GetBitmapFromPath(context, data.getData());         
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        bitmap.compress(CompressFormat.PNG, 100, out);

        int size = out.size();
        isReady = size <= IMAGE_THRESHOLD;
    } catch (Exception e) {
        isReady = false;
        Log.d("Image Error", e.getMessage());
    }

    if (isReady) {
        DialogImageView.setImageBitmap(bitmap);
        DialogStatus.setText(context.getString(R.string.image_ok));
    } else {
        DialogImageView.setImageDrawable(null);
        DialogStatus.setText(context.getString(R.string.too_big_image));
    }
}

另一个档案

public static Bitmap GetBitmapFromPath(Context context, Uri uri) {
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    String filePath = cursor.getString(column_index);
    cursor.close();
    Bitmap bitmap = BitmapFactory.decodeFile(filePath);
    return bitmap;
}

这一行

bitmap = MyImage.GetBitmapFromPath(context, data.getData());  
来自handleResult函数的

在用户加载大图像时会导致outofmemory错误。

我该如何解决这个问题?

感谢。

1 个答案:

答案 0 :(得分:0)

尝试与此类似的代码,您只需要从要检查的位图中获取File对象:

File file = new File(uri); // or new File(filePath);
file.length() // should give you a file size in bytes