我正在尝试使用图库应用。 我的应用程序拍照或在库中选择图片。 当我想设置所选图像的宽度和高度时。 我给OutOfMemoryError。
此设定图片功能, 此功能使用一个参数,即图片路径。
private void setPic(String mCurrentPhotoPath) {
targetW = foto_image.getWidth();
targetH = foto_image.getHeight();
// Get the dimensions of the bitmap
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
int photoW = bmOptions.outWidth;
int photoH = bmOptions.outHeight;
// Determine how much to scale down the image
int scaleFactor = Math.min(photoW/targetW, photoH/targetH);
// Decode the image file into a Bitmap sized to fill the View
bmOptions.inJustDecodeBounds = false;
bmOptions.inSampleSize = scaleFactor;
bmOptions.inPurgeable = true;
Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
String uri_path = storeImage(bitmap);
String respond = crud.update_photo_path(String.valueOf(position),uri_path);
if(respond == "error") {
Toast.makeText(getActivity(),getResources().getString(R.string.photos_sqlite_error),Toast.LENGTH_LONG).show();
return;
}
foto_image.setImageBitmap(bitmap);
}
这是错误
11-28 15:24:28.385 3248-3248/com.tupbebekailesi.medyasef.hamilelikrehberi E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:530)
at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:303)
at com.tupbebekailesi.medyasef.hamilelikrehberi.PhotosActivity.setPic(PhotosActivity.java:251)
at com.tupbebekailesi.medyasef.hamilelikrehberi.PhotosActivity.photo_cam_image(PhotosActivity.java:164)
at com.tupbebekailesi.medyasef.hamilelikrehberi.PhotosActivity.onActivityResult(PhotosActivity.java:116)
at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:166)
at android.app.Activity.dispatchActivityResult(Activity.java:5322)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3491)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3538)
at android.app.ActivityThread.access$1100(ActivityThread.java:153)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5289)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:0)
这在Android中是一个非常棘手的概念,您可能需要查看
http://developer.android.com/training/displaying-bitmaps/index.html
我们根据要适应的大小对图像进行采样非常重要,您可以在上面的链接中找到所有相关的detils。
重新使用图像容器也很重要。在最小视图中尝试并携带位图图像。
为每个applition提供指定数量的堆内存来存储它的缓存值,如16,32 64Mb,它对数据有好处,在处理位图时,它不会被垃圾收集(非位图对象确实得到gc) -ed),因此锁定内存并导致OOM
答案 1 :(得分:0)
在android中使用位图很棘手。在您的情况下,图片可能超过vm预算。尝试制作缓冲区并通过固定大小的缓冲区处理图像。它可能会更慢,但您将从OutOfMemory异常中保护您的代码。
此链接可能对您有所帮助 OutOfMemoryError: bitmap size exceeds VM budget :- Android
答案 2 :(得分:0)
stack_ved发布的链接解释了这个问题。