java.lang.OutOfMemoryError: mCanvas.drawBitmap(…) — java android bitmap

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд
Загрузка...

Вопрос:


Есть следующий фотографирующий код:

Parameters mParameters = mCamera.getParameters();
mParameters.setPictureSize(480, 360);
mCamera.setParameters(mParameters);
mCamera.setPreviewTexture(new SurfaceTexture(0));
mCamera.startPreview();
Thread.sleep(3000L);
final ByteArrayOutputStream i1 = new ByteArrayOutputStream();
mCamera.takePicture(null, null, new PictureCallback() {

    @Override
    public void onPictureTaken(byte[] i2, Camera i3) {
        try {
            i1.write(i2);
            i1.flush();
            i1.close();
        } catch (Exception e1) {
        }
    }

});

И есть код, рисующий на полученной фотографии:

Bitmap mBitmap = Bitmap.createBitmap(480, 360, Config.ARGB_8888);
Canvas mCanvas = new Canvas(mBitmap);
Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mCanvas.drawBitmap(BitmapFactory.decodeByteArray(i1.toByteArray(), 0, i1.toByteArray().length), 0, 0, mPaint);
mPaint.setColor(Color.argb(128, 0, 0, 0));
mCanvas.drawRect(0, 0, 290, 34, mPaint);
mPaint.setColor(Color.WHITE);
mPaint.setTextSize(24);
String description = "2016.21.10 17:25:30"
mCanvas.drawText(description, 8, 26, mPaint);
...
mBitmap.compress(CompressFormat.JPEG, 100, mOutputStream);
mOutputStream.flush();
mBitmap.recycle();

Но вылетает java.lang.OutOfMemoryError:

java.lang.OutOfMemoryError

at android.graphics.BitmapFactory.nativeDecodeByteArray(Native Method)

at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:443)

at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:460)

at mypackage.MainActivity$1$1.run(MainActivity.java:134)

at java.lang.Thread.run(Thread.java:856)

которую я получил при помощи блока try {...} catch (Error e1) {...}. В 134-ой строке записано это:

mCanvas.drawBitmap(BitmapFactory.decodeByteArray(i1.toByteArray(), 0, i1.toByteArray().length), 0, 0, mPaint);

Как исправить ошибку? Может быть у меня что-то не так с кодом? Дело в том, что я пробовал это сделать на нескольких телефонах, и, на одном из них приложение вылетало сразу при попытке нарисовать надпись, а на других двоих вылетало только на третьей фотографии. Я также пробовал сделать и немного по-другому:

Bitmap mBitmap = BitmapFactory.decodeByteArray(i1.toByteArray(), 0, i1.toByteArray().length).copy(Config.ARGB_8888, true);
...

то есть скопировать полученный Bitmap, который будет mutable = true. И флаг Paint.ANTI_ALIAS_FLAG я тоже пробовал убрать. Ничего из этого не помогло, ошибка всё та же.

Автор вопроса: nick

Источник

Вам также может быть интересно:

Drag and Drop UWP — c# xaml mvvm
Вопрос: Нужно иметь возможность добавлять изображения в приложение путем перетаскивания из файловой системы У Grid включил AllowDrop. Но как добавить перетаскиваемые изображения в коллекцию? Т.к. те ...
Растягивание Высоты , Резина — html css html5
Вопрос: Здравствуйте! Реализовал резиновый дизайн. Растягивается ширина, но длина по % не растягивается. Возможно ли это реализовать? Или так и задумано, растягивание только на ширину ...
Jquery position().left Как быть на мобильниках? — javascript jquery css
Вопрос: На мобильных устройствах, если зумишь экран, position всегда разный. $('g').position().left Как сделать так, чтобы он не менял свои значения? Автор вопроса: ...
Jquery position().left Как быть на мобильниках? — javascript jquery css
Вопрос: На мобильных устройствах, если зумишь экран, position всегда разный. $('g').position().left Как сделать так, чтобы он не менял свои значения? Автор вопроса: ...
requestAnimation и очередность отрисовки — javascript canvas
Вопрос: Здравствуйте! Реализовал 2D игру и в Edge работает все плавно и круто, но в Firefox'e подвисает, сказали, что нужно сделать, чтобы раз-два момент и все ...
Контекстное/всплывающее меню в Android — java android popup
Вопрос: Есть ли техническая возможность сделать приложение, добавляющее свое контекстное или всплывающее меню в любом месте системы? Хочу, чтобы при выделении любого текста появлялась дополнительная кнопка ...
Контекстное/всплывающее меню в Android — java android popup
Вопрос: Есть ли техническая возможность сделать приложение, добавляющее свое контекстное или всплывающее меню в любом месте системы? Хочу, чтобы при выделении любого текста появлялась дополнительная кнопка ...
Завершить службы циклом — c# windows-service
Вопрос: Можно ли остановить службы циклом? У меня есть список служб, занёс их в List List<string> name = new List<string> { "AdobeARMservice", "RemoteRegistry", "TermService", "Messenger", "SSDPSRV", ...
Завершить службы циклом — c# windows-service
Вопрос: Можно ли остановить службы циклом? У меня есть список служб, занёс их в List List<string> name = new List<string> { "AdobeARMservice", "RemoteRegistry", "TermService", "Messenger", "SSDPSRV", ...
RecyclerView — разная разметка — android recyclerview
Вопрос: Смотрел, я смотрел в сторону RecyclerView и наконец решил кинуть ListView и на тебе! В "плохом прошлом" мой ListView использовался для двух разметок. Сейчас я ...
RecyclerView — разная разметка — android recyclerview
Вопрос: Смотрел, я смотрел в сторону RecyclerView и наконец решил кинуть ListView и на тебе! В "плохом прошлом" мой ListView использовался для двух разметок. Сейчас я ...
Как правильно передать массив аргументом для пользовательской функции — php
Вопрос: Если не брать в функцию все это, тогда результат работает. А если вот так в функции все выполнять, тогда PHP ругается: «Invalid ...
Как правильно передать массив аргументом для пользовательской функции — php
Вопрос: Если не брать в функцию все это, тогда результат работает. А если вот так в функции все выполнять, тогда PHP ругается: «Invalid ...
ViewPager внутри ViewPager — такие матрешки работают? — android viewpager
Вопрос: Доброго времени суток. Назрела новая задача. Есть каталог мастеров. При выборе конкретного мастера открывается его страница (активити с ViewPager), и теперь мастеров можно перелистывать свайпом. ...
Почему id всегда 1 Yii2 — yii авторизация
Вопрос: Использую все как по документации. Для получения информации о пользователе использую $identity = $model->findOne(]); И каким бы не был email, id пользователя всегда ...