У меня есть приложение, которое получает фиксированное количество изображений с предварительного просмотра камеры и преобразует их в список Bitmaps
. Для этого у меня есть следующий код:OOM при создании растровых изображений в приложении для Android
private Camera.PreviewCallback SetPreviewCallBack() {
return new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
List<Bitmap> imageList = new ArrayList<Bitmap>();
for (int i=0; i<30; i++) // Let's suppose this is the real loop.
// It's not, as the real loop takes each camera preview frame,
// instead of inserting the same one 30 times.
// But for this example, it's OK
{
imageList.add(GetBitmap(
data,
previewWidth, // Calculated
previewHeight, // Calculated
previewFormat, // Calculated
previewRotation)); // Calculated
}
}
private Bitmap GetBitmap(byte[] data, int width, int height, int previewFormat, int rotation) {
YuvImage yuv = new YuvImage(data, previewFormat, width, height, null);
ByteArrayOutputStream out = new ByteArrayOutputStream();
yuv.compressToJpeg(new Rect(0, 0, width, height), 50, out);
byte[] bytes = out.toByteArray();
final Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
Bitmap imageResult = RotateImage(bitmap, 4 - rotation);
bitmap.recycle();
return imageResult;
}
private Bitmap RotateImage(Bitmap rotateImage, int rotation) {
Matrix matrix = new Matrix();
switch (rotation) {
case 1:
matrix.postRotate(270);
break;
case 2:
matrix.postRotate(180);
break;
case 3:
matrix.postRotate(90);
break;
}
return Bitmap.createBitmap(rotateImage, 0, 0, rotateImage.getWidth(),
rotateImage.getHeight(), matrix, true);
}
Что я делаю: - хранить этот образ на Singleton
класс для того, чтобы получить доступ к нему с другого Activity
contanied в моем же приложении. - Я снова вызываю этот фрагмент кода (когда происходит какое-то событие) и повторяю процесс извлечения/сохранения изображения.
03-05 09:35:13.339: E/AndroidRuntime(8762): FATAL EXCEPTION: Thread-818
03-05 09:35:13.339: E/AndroidRuntime(8762): java.lang.OutOfMemoryError
03-05 09:35:13.339: E/AndroidRuntime(8762): at android.graphics.Bitmap.nativeCreate(Native Method)
03-05 09:35:13.339: E/AndroidRuntime(8762): at android.graphics.Bitmap.createBitmap(Bitmap.java:726)
03-05 09:35:13.339: E/AndroidRuntime(8762): at android.graphics.Bitmap.createBitmap(Bitmap.java:703)
03-05 09:35:13.339: E/AndroidRuntime(8762): at android.graphics.Bitmap.createBitmap(Bitmap.java:636)
03-05 09:35:13.339: E/AndroidRuntime(8762): at com.facephi.sdk.ui.CameraPreview.RotateImage(CameraPreview.java:779)
03-05 09:35:13.339: E/AndroidRuntime(8762): at com.facephi.sdk.ui.CameraPreview.GetBitmap(CameraPreview.java:712)
Я пытаюсь использовать лучшие методы, чтобы удалить правильным образом неиспользованного Bitmaps
как размещены here, но не повезло ...
Любая идея о том, почему у меня это ООМ ошибка?
Установите 'android: largeHeap =" true "' для активности, а также используйте 'BitmapFactory.options' для масштабирования ваших объектов растровых изображений с помощью свойства' inSampleSize'. – Piyush
@Devill, использующий 'android: largeHeap', решает мою проблему, но я боюсь, что он, наконец, потерпит крах, поскольку он только увеличит объем памяти, который будет иметь приложение, но в какой-то момент я тоже доберусь до него. И что будет «BitmapFactory.опции' делать? – Sonhja
OOM означает, что он превышает предел памяти в размере кучи. Для «BitmapFactory.Options» вы можете проверить http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html – Piyush