【问题标题】:Out of memory exception on selection of image from gallery从图库中选择图像时出现内存不足异常
【发布时间】:2014-07-23 20:30:36
【问题描述】:

我正在创建一个应用程序,在该应用程序中我正在创建一个相册,在该相册中我从图库中选择图像,但是当我上传较大尺寸的图像时,尽管压缩了图像,但仍收到内存不足异常。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      if (requestCode == PICK_IMAGE && resultCode == RESULT_OK) {

       Uri selectedImage = data.getData();
       String[] filePathColumn = { MediaStore.Images.Media.DATA };

       Cursor cursor = getContentResolver().query(selectedImage,
         filePathColumn, null, null, null);
       cursor.moveToFirst();
       columnindex = cursor.getColumnIndex(filePathColumn[0]);
       file_path = cursor.getString(columnindex);
       // Log.e("Attachment Path:", attachmentFile);
      // tv_attach.setText(file_path);
       Log.e("file_path",file_path);
       URI = Uri.parse("file://" + file_path);

       //Retrieve filename and extension

       Filename imageFileName = new Filename(file_path, '/', '.');
       extension=imageFileName.extension();
       fileName=imageFileName.filename();
       System.out.println("Extension = " + imageFileName.extension());
       System.out.println("Filename = " + imageFileName.filename());
       //System.out.println("Path = " + imageFileName.path());
       cursor.close();

       uploadImageName=fileName+"."+extension;
       imagename.setText(uploadImageName);


       /*ImageView imageView = (ImageView) findViewById(R.id.imageView);
       imageView.setImageBitmap(BitmapFactory.decodeFile(  file_path));*/

       Bitmap image=BitmapFactory.decodeFile(file_path);
       ByteArrayOutputStream stream = new ByteArrayOutputStream();
        image.compress(Bitmap.CompressFormat.JPEG, 100, stream); //compress to which format you want.
        byte [] byte_arr = stream.toByteArray();
   //           image_str = Base64.encodeToString(byte_arr, Base64.DEFAULT);


     // String  image_str = Base64.encodeToString(byte_arr, Base64.DEFAULT);
        albumThumbnail = Base64.encodeBytes(byte_arr);

      }
}

Logcat:-

06-03 18:41:08.680: E/AndroidRuntime(1942): FATAL EXCEPTION: main
06-03 18:41:08.680: E/AndroidRuntime(1942): java.lang.OutOfMemoryError
06-03 18:41:08.680: E/AndroidRuntime(1942): at java.lang.String.<init>(String.java:433)
06-03 18:41:08.680: E/AndroidRuntime(1942): at java.lang.String.<init>(String.java:276)
06-03 18:41:08.680: E/AndroidRuntime(1942): at com.example.freejeetoproject.Base64.encodeBytes(Base64.java:834)
06-03 18:41:08.680: E/AndroidRuntime(1942):     at com.example.freejeetoproject.Base64.encodeBytes(Base64.java:719)
06-03 18:41:08.680: E/AndroidRuntime(1942):     at com.example.freejeetoproject.CreateAlbum.onActivityResult(CreateAlbum.java:152)
06-03 18:41:08.680: E/AndroidRuntime(1942):     at android.app.Activity.dispatchActivityResult(Activity.java:3988)  
06-03 18:41:08.680: E/AndroidRuntime(1942):     at android.app.ActivityThread.deliverResults(ActivityThread.java:2651)
06-03 18:41:08.680: E/AndroidRuntime(1942):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:2697)
06-03 18:41:08.680: E/AndroidRuntime(1942):     at android.app.ActivityThread.access$2000(ActivityThread.java:124)
06-03 18:41:08.680: E/AndroidRuntime(1942):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:998)
06-03 18:41:08.680: E/AndroidRuntime(1942):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-03 18:41:08.680: E/AndroidRuntime(1942):     at android.os.Looper.loop(Looper.java:130)
06-03 18:41:08.680: E/AndroidRuntime(1942):     at android.app.ActivityThread.main(ActivityThread.java:3806)
06-03 18:41:08.680: E/AndroidRuntime(1942):     at java.lang.reflect.Method.invokeNative(Native Method)
06-03 18:41:08.680: E/AndroidRuntime(1942):     at java.lang.reflect.Method.invoke(Method.java:507)
06-03 18:41:08.680: E/AndroidRuntime(1942):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-03 18:41:08.680: E/AndroidRuntime(1942):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-03 18:41:08.680: E/AndroidRuntime(1942):     at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

标签: android out-of-memory heap-memory


【解决方案1】:

试试这个代码,

android:largeHeap="true"

【讨论】:

    【解决方案2】:
    Bitmap image=BitmapFactory.decodeFile(file_path);
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    image.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
    byte [] byte_arr = stream.toByteArray();
    image_str = Base64.encodeToString(byte_arr, Base64.DEFAULT);
    
    //add this line
    image.recycle();
    image = null;
    

    位图占用大量内存,您应该释放位图以便更多内存可用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-18
      • 2015-02-19
      • 1970-01-01
      • 1970-01-01
      • 2013-10-06
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多