2013-01-15 11 views
1

我不斷嘗試在我的Android應用程序中解碼攝像頭圖像時發生OutOfMemory異常。處理這個問題有很多問題,但是我的情況特別奇怪,因爲即使只是試圖通過options.inJustDecodeBounds=true獲得邊界,我也會得到例外。OutOfMemory使用inJustDecodeBounds = true解碼圖像

下面是開始對相機的代碼:

protected void takePicture() { 
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    File image = new File(IMAGE_PATH, "camera.jpg"); 
    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image)); 
    startActivityForResult(takePictureIntent, 0); 
} 

下面是觸發異常的代碼:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == RESULT_OK) { 
     String rawImageName = new String(IMAGE_PATH + "/camera.jpg"); 

     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     BitmapFactory.decodeFile(rawImageName); // The exception is thrown here 
      . 
      . 
      . 
    } 
} 

我試圖用一個非常高的採樣率圖像進行解碼,但我仍然得到相同的例外:

options.inSampleSize = 20; 
options.inJustDecodeBounds = false; 
options.inPreferredConfig = Bitmap.Config.RGB_565; 
Bitmap photo = BitmapFactory.decodeFile(rawImageName); // Again the exception 

除此之外,應用程序似乎運行co正確,並有足夠的空閒內存。我可以正確打開圖庫應用程序中的圖像。將圖像移動到不同的目錄並沒有幫助。任何想法可能會導致它?使用inJustDecodeBounds = true進行解碼時可能會導致異常情況?

+0

告訴我們你的堆棧跟蹤。 – Archer

+1

我想你應該看看這個鏈接:http://developer.android.com/training/displaying-bitmaps/load-bitmap.html – Houcine

+0

嗯,這恰好是一個愚蠢的複製粘貼錯誤。該問題是否應該刪除?它對別人有什麼價值嗎? – FireAphis

回答

10

您需要將選項傳遞給解碼呼叫:

BitmapFactory.decodeFile(rawImageName, options); 
+1

哦,我的愚蠢!這就是您複製粘貼代碼時發生的情況。 Grrr小時拉我的頭髮! – FireAphis

2
BitmapFactory.Options o2 = new BitmapFactory.Options(); 
o2.inSampleSize = 4; // 1/4 
o2.inPurgeable = true; 
Bitmap b=BitmapFactory.decodeFile(imagePath,o2); 

嘗試。並調整圖像大小並在使用後使位圖對象爲空。 打電話給System.gc();它並沒有打電話給gc,但它提供了提示。 也不會使很多的位圖對象。重用相同的位圖對象並在使用後使其爲空。

+0

相反,在位圖上使用recycle()而不是gc。 GC可能無法立即釋放內存。請參閱http://mobi-solutions.blogspot.com/2010/08/how-to-if-you-want-to-create-and.html和http://stackoverflow.com/questions/3823799/android-bitmap -recycle-how-it-work – Chris

+1

是的你是對的。如果你不再使用位圖對象回收它們。 – Siddhesh

+0

調用System.gc()實際上是一種應該避免的反模式。你可以在網上找到很多有關這方面的文檔。總而言之,它尖叫着「破碎的代碼」,它不保證做任何事情,它可能會減慢你的代碼,因爲你可能會開始一個完整的GC週期。總是避免System.gc()。 –