2016-07-25 46 views
0

我使用这个功能来旋转从摄像机位图或画廊:Android Studio中的位图分配了内存不足的错误

public static Bitmap fixOrientation(Bitmap mBitmap) { 

    if (mBitmap.getWidth() > mBitmap.getHeight()) { 
     Matrix matrix = new Matrix(); 
     matrix.postRotate(90); 
     return Bitmap.createBitmap(mBitmap , 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, true); // the error is here! 
    } 
    return mBitmap; 
} 

其workes在头两次我使用它细,但在第三次崩溃的应用程序,并给我这个错误:

java.lang.OutOfMemoryError: Failed to allocate a 36578316 byte allocation with 16771872 free bytes and 29MB until OOM 

这是这个函数被调用:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (resultCode == RESULT_OK && data != null) { 

     Uri uri = data.getData(); 

     try { 

      Bitmap sourceBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri); 

      Bitmap correctBitmap = fixOrientation(sourceBitmap); 
      image.setImageBitmap(correctBitmap); 

      bitmapsArray[cameraSideInt] = correctBitmap; 
      chooseImageLayout.setVisibility(View.GONE); 
      // show change layout 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

任何人都可以想办法解决这个错误?

+0

尽量不要在内存中存储如此多的位图 –

回答

-1

是的 - 不要保存那么多位图。你将它们存储在一个数组中。位图占用大量内存。当他们在这个阵列中时,他们不能被垃圾收集,所以内存就会丢失。你可能不应该这样做。

您可以在应用程序中查找其他内存泄漏,它们可能存在并且可能会节省足够的内存以使其可行。但它是一个坏主意,尤其是如果位图很大(接近全屏的任何东西)。

+0

好吧,那么如何保存位图?我从用户(相机或画廊)获取图像,并且我正在进行多项活动,所以我需要一种方法来存储我得到的图像。 – Rom

+0

活动之间?将它们存储到磁盘并传递文件名。 –

+0

谢谢,修复它! – Rom

相关问题