2013-08-19 4 views
7

Это мой код:как исправить эту ошибку: java.lang.OutOfMemoryError

public void onPictureTaken(byte[] data, Camera camera) { 
    Bitmap foto = BitmapFactory.decodeByteArray(data, 0, data.length); 
    wid = foto.getWidth(); 
    hgt = foto.getHeight(); 

    Bitmap newImage = Bitmap.createBitmap(wid, hgt, Bitmap.Config.ARGB_4444); 
    Canvas canvas = new Canvas(newImage); 
    canvas.drawBitmap(foto, 0f, 0f, null); 
    if (newImage.getWidth() > newImage.getHeight()) { 
     Matrix matrix = new Matrix(); 
     matrix.postRotate(90); 
     newImage.createBitmap(newImage, 0, 0, wid, hgt, matrix, true); 

    } 
} 

Это моя ошибка:

FATAL EXCEPTION: main 
java.lang.OutOfMemoryError 
at android.graphics.Bitmap.nativeCreate(Native Method) 
at android.graphics.Bitmap.createBitmap(Bitmap.java:689) 
at android.graphics.Bitmap.createBitmap(Bitmap.java:666) 
at android.graphics.Bitmap.createBitmap(Bitmap.java:633) 
at com.supratecnologia.activity.Camera_Activity.onPictureTaken(Camera_Activity.java:189) 
at android.hardware.Camera$EventHandler.handleMessage(Camera.java:768) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:5041) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
at dalvik.system.NativeStart.main(Native Method) 
+0

Ошибка довольно ясна, вы используете слишком много памяти. Я рекомендую вам проверить использование памяти вашего приложения и точно отслеживать, когда эта ошибка произойдет. – Rafael

+0

http://stackoverflow.com/questions/17990086/out-of-memory-while-creating-bitmaps-on-device/17990482#17990482 –

ответ

9

ост раз это происходит из-за большого растрового изображения пересечь границу кучи VM, поэтому вам нужно уменьшить масштаб изображения или снизить качество изображения.

Для масштабирования используйте BitmapFactory.Options.

Bitmap bm = null; 
BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inSampleSize = 5; 
AssetFileDescriptor fileDescriptor =null; 
try { 
    fileDescriptor = this.getContentResolver().openAssetFileDescriptor(selectedImage,”r”); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} 
finally{ 
    try { 
     bm = BitmapFactory.decodeFileDescriptor(fileDescriptor.getFileDescriptor(), null, options); 
     fileDescriptor.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Или используйте Bitmap.compress(), чтобы снизить качество изображения.

И вы также можете следовать этому conversation, чтобы избежать ошибки памяти при загрузке изображений в растровое изображение.

0

Если вы используете эмулятор, у вас может быть слишком мало для кучи VM для этого экземпляра эмулятора. Проверьте расширенный параметр в эмуляторе и попробуйте увеличить значение для кучи VM. Случилось так, что в моем телефоне работал, но не в эмуляторе, для низкого значения кучи VM. В любом случае, если у вас нет большого количества изображений, возможно, у них слишком высокое разрешение.

Смежные вопросы