BitmapFactory.decodeFile OutOfMemoryError?

时间:2013-11-28 13:37:03

标签: android

我正在尝试使用图库应用。 我的应用程序拍照或在库中选择图片。 当我想设置所选图像的宽度和高度时。 我给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)

3 个答案:

答案 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发布的链接解释了这个问题。

另见question/answer