Outofmemoryerror when creating a bitmap

I am making a camer application which may contain a preview of the camera and png.

I would like to save the images in the onPictureTaken callback

my source is below

public void onPictureTaken(byte[] data, Camera camera) { //preview from camera Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); // overlay image Bitmap overlayBmp = overlay.getDrawingCache(); //blank beatmap Bitmap blankBitmap = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Bitmap.Config.ARGB_8888); //make canvas Canvas canvas = new Canvas(blankBitmap); //composite image canvas.drawBitmap(bitmap, null,new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()), null); canvas.drawBitmap(overlayBmp, null,new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()), null); 

However, this shows outofmemoryerror, how can I solve this problem ..?

 05-20 15:13:49.114: E/AndroidRuntime(31647): FATAL EXCEPTION: main 05-20 15:13:49.114: E/AndroidRuntime(31647): java.lang.OutOfMemoryError 05-20 15:13:49.114: E/AndroidRuntime(31647): at android.graphics.Bitmap.nativeCreate(Native Method) 05-20 15:13:49.114: E/AndroidRuntime(31647): at android.graphics.Bitmap.createBitmap(Bitmap.java:605) 05-20 15:13:49.114: E/AndroidRuntime(31647): at android.graphics.Bitmap.createBitmap(Bitmap.java:585) 05-20 15:13:49.114: E/AndroidRuntime(31647): at com.example.firstcameraappli.MainActivity$2.onPictureTaken(MainActivity.java:103) 05-20 15:13:49.114: E/AndroidRuntime(31647): at android.hardware.Camera$EventHandler.handleMessage(Camera.java:750) 05-20 15:13:49.114: E/AndroidRuntime(31647): at android.os.Handler.dispatchMessage(Handler.java:99) 05-20 15:13:49.114: E/AndroidRuntime(31647): at android.os.Looper.loop(Looper.java:137) 05-20 15:13:49.114: E/AndroidRuntime(31647): at android.app.ActivityThread.main(ActivityThread.java:4514) 05-20 15:13:49.114: E/AndroidRuntime(31647): at java.lang.reflect.Method.invokeNative(Native Method) 05-20 15:13:49.114: E/AndroidRuntime(31647): at java.lang.reflect.Method.invoke(Method.java:511) 05-20 15:13:49.114: E/AndroidRuntime(31647): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980) 
+7
source share
3 answers

Try this code ....

 PictureCallback myPictureCallback_JPG = new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera arg1) { BitmapFactory.Options opt; opt = new BitmapFactory.Options(); opt.inTempStorage = new byte[16 * 1024]; Parameters parameters = arg1.getParameters(); Size size = parameters.getPictureSize(); int height11 = size.height; int width11 = size.width; float mb = (width11 * height11) / 1024000; if (mb > 4f) opt.inSampleSize = 4; else if (mb > 3f) opt.inSampleSize = 2; //preview from camera Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,opt); } } 

Get the image in a bitmap, and then use as per your requirements.

+15
source

This is a well known issue on Android. The problem is that managing bitmap images requires more memory than is available on most devices. However, you can use certain tricks. Some discussions and solutions to help you:

0
source

if you want to save the image to sdcard, try like this

 public void onPictureTaken(byte[] data, Camera camera) { camera.startPreview(); FileOutputStream outStream = null; try { outStream = new FileOutputStream( "/mnt/sdcard/mypicture.png"); outStream.write(data); outStream.close(); Log.d("Log", "onPictureTaken - wrote bytes: " + data.length); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { } } 
0
source

All Articles