Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android out of memory on image capture

I have an Activity which takes photos (with full possible resolution, so quite large), the application have then the chance to analyze them. Only one photo is handled at a time. The problem is that I run in to a "Out of memory" after 4 - 5 photos. I see

dalvikvm-heap Out of memory on a 5070745-byte allocation

(the byte size varies) followed by

Camera-JNI Couldn't allocate byte array for JPEG data

My application does not crash but as it appears to me the Camera simply becomes unable to deliver the images from this point on. I pay attention to memory usage in my application but here it seems that there is a memory leak somewhere outside and I'm asking me how can I cope with this. Any solution approaches existing for this?

like image 891
georgij Avatar asked Dec 22 '10 16:12

georgij


People also ask

How do you handle bitmaps in Android as it takes too much memory?

Choose the most appropriate decode method based on your image data source. These methods attempt to allocate memory for the constructed bitmap and therefore can easily result in an OutOfMemory exception. Each type of decode method has additional signatures that let you specify decoding options via the BitmapFactory.

Does image capture work with Android?

Image Capture on your Mac The native app macOS app that works with a lot of third-party devices is Image Capture. Not only can you use it for your iPhone or DSLR camera, but you can also use a scanner with the app. That also means you can use it to import pictures from your Android too.


1 Answers

This may not be exactly what you are trying to do, but in order to display multiple large pictures (4-6 MB) on a grid view, I found this code to create a smaller bitmap with lower quality, to avoid out-of-memory situations:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 5;
options.inPurgeable = true;
options.inInputShareable = true;
Bitmap bm = BitmapFactory.decodeFile("/sdcard/myapp/" + filesFound.get(position), options);

The options are the important part, and by varying the settings, I managed to take memory down from where it would crash, to around 28MB when I started using the inSampleSize. It further went down with the inPurgeable and inInputShareable settings set to true. My activity is still sluggish, but it's much better.

For your application, if it can analyze a bitmap, the above code may shrink down the memory usage enough to make it work. I'm still new to Android, so it's possible this may not work at all.. ;-).

Regards,

Kevin

like image 124
ktambascio Avatar answered Sep 23 '22 18:09

ktambascio