Android няма памет при заснемане на изображение

Имам дейност, която прави снимки (с пълна възможна разделителна способност, така че доста големи), след това приложението има възможност да ги анализира. В даден момент се обработва само една снимка. Проблемът е, че след 4-5 снимки попадам на "Недостиг на памет". Виждам

dalvikvm-heap Няма памет при 5070745-байтово разпределение

(размерът на байта варира), последван от

Camera-JNI Не можа да разпредели байтов масив за JPEG данни

Приложението ми не се срива, но както ми се струва, камерата просто не може да доставя изображенията от този момент нататък. Обръщам внимание на използването на паметта в моето приложение, но тук изглежда, че има изтичане на памет някъде навън и ме питам как мога да се справя с това. Съществуват ли подходи за решение за това?


person georgij    schedule 22.12.2010    source източник


Отговори (2)


Това може да не е точно това, което се опитвате да направите, но за да покажа няколко големи картини (4-6 MB) в изглед на мрежата, намерих този код за създаване на по-малка растерна графика с по-ниско качество, за да избегна извън- ситуации на паметта:

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

Опциите са важната част и чрез промяна на настройките успях да намаля паметта от мястото, където щеше да се срине, до около 28 MB, когато започнах да използвам inSampleSize. Освен това се понижи с настройките inPurgeable и inInputShareable, зададени на true. Дейността ми все още е бавна, но е много по-добре.

За вашето приложение, ако може да анализира растерно изображение, горният код може да намали достатъчно използването на паметта, за да работи. Все още съм нов в Android, така че е възможно това изобщо да не работи.. ;-).

За разбирането,

Кевин

person ktambascio    schedule 22.12.2010

Тъй като паметта ви свършва след 4-5 снимки, вероятно не извиквате yourBitmap.recycle(); след като е записан на SD-картата?

Също така в метода onPictureTaken() можете да запазите tempData от картината в растерно изображение, като използвате Bitmap.Config.RGB_565 вместо ARGB(по подразбиране), ако не се нуждаете от алфа канал.

   // Create options to help use less memory   
    Options opt = new Options();
    opt.inPreferredConfig = Bitmap.Config.RGB_565;

   // Decode the tempdata into a bitmap, with the options as the last argument 
    bitmapFromRawCameraTempData = BitmapFactory.decodeByteArray(rawCameraTempData, 0, rawCameraTempData.length, opt);
person DecodeGnome    schedule 28.02.2011
comment
Използвах това, но не може да реши проблема ми с паметта? Също така не трябва да използвам inSampleSize. Какво мога да направя повече? - person atasoyh; 28.06.2013
comment
Може да погледнете WeakReference, може би ще помогне: уеб блогове .java.net/blog/2006/05/04/understanding-weak-references - person DecodeGnome; 01.07.2013