从库(SD卡)中挑选图像以便在我的应用程序中使用的例外... java.lang.OutOfMemoryError:位图大小超过VM预算

时间:2011-01-31 12:41:59

标签: android android-gallery

我正在使用android在我的应用程序上选择图像,我不知道为什么,有时我有一个例外,我认为它总是我选择一个超过400或500 kb的图像,但我不确定。为什么?因为当我选择100 kb的小图像时,我不会得到异常,当我得到高KB或MB的图像时,它会与java.lang.OutOfMemoryError: bitmap size exceeds VM budget一起崩溃。 但非常重要:它在模拟器上崩溃,但在我的手机上也崩溃了,这不是模拟器的失败。

这是我的代码:

changeImageButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Intent i = new Intent(Intent.ACTION_PICK,
                        android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI);
                startActivityForResult(i, ACTIVITY_SELECT_IMAGE);
            }
        }); 



protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 
        super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 

        switch(requestCode) {
        case 1:
        {
            setResult(1);
            finish();    
        }
        case ACTIVITY_SELECT_IMAGE:
            if(resultCode == RESULT_OK){  
                Uri selectedImage = imageReturnedIntent.getData();
                String[] filePathColumn = {MediaStore.Images.Media.DATA};

                Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
                cursor.moveToFirst();

                int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                String filePath = cursor.getString(columnIndex);
                cursor.close();

                selectedPhoto = BitmapFactory.decodeFile(filePath);
                //profileImage.setImageBitmap(selectedPhoto);
                profileImage.setImageBitmap(Bitmap.createScaledBitmap(selectedPhoto, 80, 80, false));
            }
        }
    }

profileImage是我布局的ImageView。我使用缩放的butmap将图像重新调整为80x80

请给我一些关于这个例外的帮助,我需要解决它

这是例外:

 01-31 12:38:37.531: ERROR/AndroidRuntime(1025): Uncaught handler: thread main exiting due to uncaught exception
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:375)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:171)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:196)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at com.GPSLoc.Configuration.onActivityResult(Configuration.java:253)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.app.Activity.dispatchActivityResult(Activity.java:3595)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3001)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3047)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.app.ActivityThread.access$2300(ActivityThread.java:112)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1721)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.os.Handler.dispatchMessage(Handler.java:99)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.os.Looper.loop(Looper.java:123)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at android.app.ActivityThread.main(ActivityThread.java:3948)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at java.lang.reflect.Method.invokeNative(Native Method)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at java.lang.reflect.Method.invoke(Method.java:521)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
    01-31 12:38:37.552: ERROR/AndroidRuntime(1025):     at dalvik.system.NativeStart.main(Native Method)

1 个答案:

答案 0 :(得分:1)

Bitmap.createScaledBitmap方法,只要我研究过具有高点的内存消耗并产生该错误,但是,我并不完全确定它。无论如何它是JAVA API,你不能更深入。

你可以做下一个:

//create a Drawable with your image as parameter
BitmapDrawable d= new BitmapDrawable(youBitmap);
//define bounds for your drawable       
int left =0;
int top = 0;
int right=80;
int bottom=80;

Rect r = new Rect(left,top,right,bottom);
//set the new bounds to your drawable       
d.setBounds(r);
//set the drawable as view of your image view
profileImage.setImageDrawable(d); 

我没有测试过这段代码,但它应该可以运行。