我正在尝试从图库中加载大图像(大约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();
}
}
答案 0 :(得分:0)
java.lang.OutOfMemoryError在图像加载时发生。因为手机内存有一定的局限性。因此,不要直接加载图像使用像毕加索等的某种库。并根据您不需要的尺寸在原始尺寸中加载图像,这将减少内存消耗。
并替换
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的更多信息希望这有帮助。
干杯!