2012-07-08 3 views
13

mio codice è:MediaStore.Images.Media.getBitmap e di errore di memoria

public Bitmap loadPhoto(Uri uri) { 
    Bitmap scaled = null; 
    try { 
    scalled = Bitmap.createBitmap(
     MediaStore.Images.Media.getBitmap(getContentResolver(), uri), 
     0,0,90, 90); 

    if (scaled == null) { return null; } 
    } catch(Exception e) { } 
    return scaled; 
} 

Dopo questo. Esposizione ridimensionata in ImageView. Ogni immagine proviene dalla fotocamera del dispositivo.

Ogni volta, ottengo l'errore: della memoria dopo aver visualizzato tre foto dalla fotocamera. Come risolvere questo?

+1

Ho avuto lo stesso problema, controlla questo link: [http://tutorials-android.blogspot.co.il/2011/11/ outofmemory-exception-when-decoding.html] (http://tutorials-android.blogspot.co.il/2011/11/outofmemory-exception-when-decoding.html) – zwebie

+1

Vedi anche il bel tutorial di Chet Haase sul ridimensionamento della bitmap: http://www.youtube.com/watch?v=12cB7gnL6po –

+0

essere consapevoli *** QUESTA PAGINA È MOLTO FUORI DATA *** - oggi basta fare questo: http://stackoverflow.com/a/24135522/ 294884 – Fattie

risposta

1

Il metodo MediaStore.getBitmap è un metodo di convenienza che non specifica una dimensione del campione, quando ottenere il bitmap. Se si utilizza getBitmap (ContentResolver, Uri) e si desidera utilizzare una dimensione di esempio, utilizzare ContentResolver per ottenere il flusso di input e decodificare la bitmap come si farebbe normalmente (calcolando prima la dimensione del campione e quindi caricandola con l'appropriata misura di prova).

+1

Sembra un buon approccio, il codice per renderebbe la risposta migliore – weston

+0

@weston Google fornisce questo codice di esempio (relativo al caricamento efficiente di bitmap) su [link] (http://developer.android.com/training/displaying-bitmaps/load-bitmap.html) L'uso di ContentResolver può essere trovato cercando all'implementazione per MediaStore.getBitmap. Fa una chiamata al risolutore allo stesso modo –

+1

So che puoi trovare le risposte altrove, poiché dovevo farlo già perché la risposta è incompleta. Chiunque legga questa risposta dovrà fare lo stesso lavoro sulle gambe. Una buona risposta Stack Overflow non si basa su collegamenti esterni per completarla. – weston

2

Per coloro che sono alla ricerca di codice di esempio:

private static int calculateInSampleSize(
     BitmapFactory.Options options, int reqWidth, int reqHeight) { 
    // Raw height and width of image 
    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if (height > reqHeight || width > reqWidth) { 

     final int halfHeight = height/2; 
     final int halfWidth = width/2; 

     // Calculate the largest inSampleSize value that is a power of 2 and keeps both 
     // height and width larger than the requested height and width. 
     while ((halfHeight/inSampleSize) >= reqHeight 
       && (halfWidth/inSampleSize) >= reqWidth) { 
      inSampleSize *= 2; 
     } 
    } 

    return inSampleSize; 
} 

public static Bitmap decodeSampledBitmapFromUri(Context context, Uri imageUri, int reqWidth, int reqHeight) throws FileNotFoundException { 

    // Get input stream of the image 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    InputStream iStream = context.getContentResolver().openInputStream(imageUri); 

    // First decode with inJustDecodeBounds=true to check dimensions 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeStream(iStream, null, options); 

    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    return BitmapFactory.decodeStream(iStream, null, options); 
} 
+0

hai davvero provato questa funzione da solo? Ho provato questo e la funzione decodeSampledBitmapFromUri restituisce sempre null. e dopo una ricerca piuttosto lunga ho scoperto che non è possibile utilizzare lo stesso inputstream come parametro per BitmapFactory.decodeStream più di una volta. – Dika