2012-08-27 3 views
0

Je suis Tring pour obtenir l'image de la galerie (par intention).
J'ai eu cette erreur:Bitmap de mémoire

985120-byte external allocation too large for this process. 
Out of memory: Heap Size=4871KB, Allocated=2472KB, Bitmap Size=19677KB 
VM won't let us allocate 985120 bytes 

C'est mon code où je reçois l'image:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    .... 
    mBitmap = Media.getBitmap(this.getContentResolver(), data.getData()); 
    ... 
} 

Comment puis-je résoudre?

MISE A JOUR -------- ---------

Je remarque que si je sélectionne une image pré-existante (photo HTC installé) Je reçois cette erreur. Si je choisis l'image choisie de la caméra tout fonctionne bien.

Alors, je change mon code selon cette http://developer.android.com/training/displaying-bitmaps/load-bitmap.html:

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inJustDecodeBounds = true; 

InputStream stream = getContentResolver().openInputStream(data.getData()); 
mBitmap = BitmapFactory.decodeStream(stream,null,options); 
stream.close(); 

Mais maintenant, le bitmap est NULL !!!

+0

double possible de http://stackoverflow.com/questions/6118464/android-out-of-memory-error-bitmap-is-too-big?rq=1 – Ridcully

+0

options.inJustDecodeBounds = true; avec cela, vous ne décoderez que la taille de l'image bitmap, ne l'allouez pas, c'est pourquoi c'est nul. Essayez d'utiliser options.inScale pour réduire la taille de l'image bitmap. –

+0

http://stackoverflow.com/a/4665992/1615280 – bjorncs

Répondre

1

Il semble que votre application utilise beaucoup de bitmap haute résolution (la partition de mémoire bitmap est 19677KB). Le sas de 'tas' et 'alloué' est tout à fait normal, et ne devrait pas poser de problème. Assurez-vous que vous supprimez bitmap inutilisé de la mémoire. Vous pouvez libérer un bitmap de la mémoire en appelant le bitmap.recycle() ou en définissant la référence sur null. Jetez un oeil à LruCache si vous souhaitez mettre en cache des bitmaps pour des raisons de performances.

+0

[LRUCache] (http://developer.android.com /training/displaying-bitmaps/cache-bitmap.html) par exemple avec un peu plus de détails – zapl

+0

j'ai eu cette erreur quand je prends exemple image dans ma galerie (image htc installée) qui est 19MB (peut-être). – enfix

+0

D'accord, je pensais que les 985120 octets mentionnés dans le message d'erreur était la taille de votre image. 19 Mo est beaucoup de données, il n'y a peut-être pas de bonne solution pour cela si vous utilisez un téléphone HTC à faible spécification. Il y a une fonction de redimensionnement des images à la volée lors de l'analyse, attendez .... – bjorncs

0

J'enveloppe toujours le décodage dans une boucle tout en augmentant la inSampleSize et la capture OutOfMemoryError. Cela vous donnera l'image de résolution maximale possible. Utilisez toujours des caches LRU!

Bitmap image; 
    boolean success = false;int counter = 0; 
    while (success == false && counter < 10) 
    { 
     try 
     { 
      image = BitmapFactory.decodeFile(photoPath, options); 
      success = true; 
     } 
     catch(OutOfMemoryError e) 
     { 
      System.gc(); 
      options.inSampleSize++; 
      counter++; 
     } 
    } 
+0

Ne fonctionne pas. L'image est toujours nulle – enfix

Questions connexes