尝试从库

时间:2016-07-05 19:36:57

标签: java android

我正在尝试从图库中加载大图像(大约30MB-70MB)。我一直面临的问题是:

  

致命异常:主程序:com.parse.starter,PID:29795
  java.lang.OutOfMemoryError:无法分配1866240012字节   分配2323392个空闲字节和380MB直到OOM       at dalvik.system.VMRuntime.newNonMovableArray(Native Method)       在android.graphics.BitmapFactory.nativeDecodeStream(本机方法)       在android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:635)       在android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:611)       在android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:649)       在android.provider.MediaStore $ Images $ Media.getBitmap(MediaStore.java:867)       在com.parse.starter.AddPhotosActivity.onActivityResult(AddPhotosActivity.java:151)       在android.app.Activity.dispatchActivityResult(Activity.java:6428)       在android.app.ActivityThread.deliverResults(ActivityThread.java:3695)       在android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)       在android.app.ActivityThread.-wrap16(ActivityThread.java)       在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1393)       在android.os.Handler.dispatchMessage(Handler.java:102)       在android.os.Looper.loop(Looper.java:148)       在android.app.ActivityThread.main(ActivityThread.java:5417)       at java.lang.reflect.Method.invoke(Native Method)       在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726)       在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

这是我的代码(在崩溃日志中如上所述的第151行)在其上方有一条注释。基本上,最终目标是我想立即检测所选图像是否大于10MB。如果是,则发送Toast,如果没有,则继续将图像保存到后端。

if (requestCode == SELECT_PHOTO && resultCode == RESULT_OK)
{
    Uri uri = data.getData();
    File f = new File(uri.getPath());

    try
    {
        // LINE BELOW IS THE LINE 151, ERROR CRASH
        Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
        if (bitmap.getByteCount() > 10485760)
        {
            Toast.makeText(AddPhotosActivity.this, "That file is too large to attach to a Grievance, please try again!", Toast.LENGTH_SHORT).show();
        }
        else
        {
            mImageOne.setImageBitmap(bitmap);
            SaveImageOne(bitmap);
        }

    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
}

3 个答案:

答案 0 :(得分:0)

java.lang.OutOfMemoryError在图像加载时发生。因为手机内存有一定的局限性。因此,不要直接加载图像使用像毕加索等的某种库。并根据您不需要的尺寸在原始尺寸中加载图像,这将减少内存消耗。

picasso

并替换

mImageOne.setImageBitmap(bitmap);

Picasso.with(context).load(uri).resize(50, 50).centerCrop().into(mImageOne);

//这里50,50是新维度,centercrop是scaletype

答案 1 :(得分:-1)

您可以使用以下方法测试文件:

File file = new File(uri.getPath());

// Get length of file in bytes
long fileSizeInBytes = file.length();

//10485760 will work for your phone, but not for all
if (fileSizeInMB > 10485760) {
  ...
}¸
通过这种方式,您不必使用太多内存来转换图片 但是内存泄漏表明了另一个问题。 正如Shahbaz Hashmi所说,你应该考虑像毕加索这样的东西,或改变你加载图像的方式。

我不确定您希望完成什么,但如果您想从图库或相机加载图片,请查看本教程:http://www.theappguruz.com/blog/android-take-photo-camera-gallery-code-sample

答案 2 :(得分:-1)

根据有问题的输入,您似乎首先要在处理之前检查文件大小。您可以通过创建File对象来完成此操作,如下所示:

File file = new File("<<Provide full file path>>");
long length = file.length();

if (length  > 10485760)
{
            Toast.makeText(AddPhotosActivity.this, "That file is too large to attach to a Grievance, please try again!", Toast.LENGTH_SHORT).show();
}

URL

了解有关api的更多信息

希望这有帮助。

干杯!