how to correct this error: java.lang.OutOfMemoryError

孤者浪人 提交于 2019-12-07 00:07:41

问题


This is my code:

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);

    }
}

This is my error:

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)

回答1:


ost of times this happens due to large bitmap cross the limit of VM heap, so you need to scale down your image or to lower the quality of you image.

To scale image use 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();
    }
} 

Or use Bitmap.compress() to lower quality of image.

And you can also follow this conversation to avoid memory error while loading images in Bitmap.




回答2:


If you are using an emulator you might have a value for VM Heap too low for that emulator instance. Check the Advanced Option in the emulator and try increasing the value for VM Heap. It happened to me that in my phone was working but not in the emulator for the low VM Heap value. Anyway, if you don't have lots of images probably they have a resolution too high.



来源:https://stackoverflow.com/questions/18321554/how-to-correct-this-error-java-lang-outofmemoryerror

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!