Android не хватает памяти при захвате изображения - PullRequest
7 голосов
/ 22 декабря 2010

У меня есть Активность, которая делает фотографии (с полным возможным разрешением, очень большим), и приложение может их проанализировать.Только одна фотография обрабатывается за один раз.Проблема в том, что после 4 - 5 фотографий я сталкиваюсь с "Недостаточно памяти".Я вижу

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

(размер байта варьируется), а затем

Камера-JNI Не удалось выделить байтовый массив для данных JPEG

Мое приложение не падает, но, как мне кажется, камера просто не может доставлять изображения с этого момента.Я обращаю внимание на использование памяти в моем приложении, но здесь кажется, что где-то снаружи есть утечка памяти, и я спрашиваю меня, как я могу справиться с этим.Есть ли подходящее решение для этого?

Ответы [ 2 ]

11 голосов
/ 22 декабря 2010

Возможно, это не совсем то, что вы пытаетесь сделать, но для отображения нескольких больших изображений (4-6 МБ) в виде сетки я нашел этот код для создания меньшего растрового изображения с более низким качеством, чтобы избежать-ситуации памяти:

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 МБ, когда я начал использовать inSampleSize.Далее он пошел вниз с настройками inPurgeable и inInputShareable, установленными в true.Моя деятельность все еще вялая, но намного лучше.

Для вашего приложения, если оно может анализировать растровое изображение, приведенный выше код может уменьшить использование памяти настолько, чтобы оно заработало.Я все еще новичок в Android, так что возможно, это может вообще не работать ..; -).

С уважением,

Кевин

3 голосов
/ 28 февраля 2011

Поскольку у вас заканчивается память после 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);
...