2013-08-19 38 views
7

To jest mój kod:jak naprawić ten błąd: 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); 

    } 
} 

To jest mój błąd:

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

Błąd jest całkiem jasny, zużywasz zbyt dużo pamięci. Zalecam sprawdzenie zużycia pamięci w aplikacji i dokładne śledzenie, kiedy wystąpi ten błąd. – Rafael

+0

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

Odpowiedz

9

ost razy to się dzieje, ze względu na dużą bitmapę przekroczyć granicę sterty VM, więc musisz zmniejszyć obraz lub obniżyć jakość obrazu.

Skalowanie obrazu użyj 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(); 
    } 
} 

Lub użyj Bitmap.compress(), aby obniżyć jakość obrazu.

Możesz także wykonać tę operację podając conversation, aby uniknąć błędu pamięci podczas ładowania obrazów w bitmapie.

0

Jeśli korzystasz z emulatora, wartość dla sterty maszyn wirtualnych może być zbyt niska dla instancji emulatora. Sprawdź opcję zaawansowaną w emulatorze i spróbuj zwiększyć wartość sterty VM. Zdarzyło mi się, że w moim telefonie działał, ale nie w emulatorze dla niskiej wartości VM Heap. W każdym razie, jeśli nie masz dużo obrazów, prawdopodobnie mają zbyt wysoką rozdzielczość.

Powiązane problemy