J'ai une application qui obtient une quantité fixe d'images à partir de l'aperçu de la caméra et les convertit en une liste de Bitmaps
. A cette fin, je le code suivant:OOM lors de la création de bitmaps sur une application 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);
}
Ce que je fais est: - je stocker cette image sur une classe Singleton
afin d'y accéder d'un autre Activity
contanied dans ma même application. - J'appelle à nouveau ce morceau de code (lorsqu'un événement se produit) et répète le processus d'extraction/de sauvegarde de l'image.
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)
J'essaie d'utiliser les meilleures pratiques pour éliminer de la manière correcte Bitmaps
utilisé comme posté here, mais pas de chance ...
Toute idée pourquoi je vais avoir cette erreur OOM?
Définissez 'android: largeHeap =" true "' pour l'activité et également 'BitmapFactory.options' pour mettre à l'échelle vos objets bitmap avec la propriété' inSampleSize'. – Piyush
@Devill en utilisant 'android: largeHeap' résout mon problème, mais j'ai bien peur qu'il finisse par planter car cela ne fait qu'augmenter la quantité de mémoire que l'application aura, mais à un moment je l'atteindrai aussi. Et qu'est-ce que 'BitmapFactory.options 'faire? – Sonhja
OOM signifie qu'il dépasse la limite de mémoire de la taille du tas. Pour 'BitmapFactory.Options' vous pouvez vérifier http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html – Piyush