2012-11-06 3 views
0

Je souhaite afficher cette image et la télécharger sur un serveur. J'utilise l'application appareil photo pour prendre une photo et retourner le chemin du fichier de la photo à une activité. Je rencontre une erreur de mémoire insuffisante sur certains téléphones car j'ai une taille d'image constante que j'essaie d'importer entre les appareils.Erreur de mémoire insuffisante - Taille de bitmap

Comment puis-je tirer la plus grande taille d'image possible pour télécharger sur le serveur tout en continuant à travailler dans les limites de la mémoire du téléphone?

Code suit:

demande de chargement Aync

GetBitmapTask GBT = new GetBitmapTask(dataType, path, 1920, 1920, loader); 
GBT.addAsyncTaskListener(new AsyncTaskDone() 
{ 
    @Override 
    public void loaded(Object resp) 
    {    
     crop.setImageBitmap((Bitmap)resp); 
     crop.setScaleType(ScaleType.MATRIX); 
    } 

    @Override 
    public void error() { 
    } 
}); 

GBT.execute(); 

Le Groupe Async qui jette l'erreur OOM

public class GetBitmapTask extends AsyncTask<Void, Integer, Bitmap> 
{ 

... 

@Override 
public Bitmap doInBackground(Void... params) 
{ 
    Bitmap r = null; 

    if (_dataType.equals("Unkown")) 
    { 
     Logger.e(getClass().getName(), "Error: Unkown File Type"); 
     return null; 
    } 
    else if (_dataType.equals("File")) 
    { 
     Options options = new Options();    
     options.inJustDecodeBounds = true; 

     //Logger.i(getClass().getSimpleName(), _path.substring(7)); 

     BitmapFactory.decodeFile(_path.substring(7), options); 

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

     Logger.i(getClass().getSimpleName(), 
       "height: " + options.outHeight + 
       "\nwidth: " + options.outWidth + 
       "\nmimetype: " + options.outMimeType + 
       "\nsample size: " + options.inSampleSize); 

     options.inJustDecodeBounds = false; 
     r = BitmapFactory.decodeFile(_path.substring(7), options); 

    } 
    else if (_dataType.equals("Http")) 
    { 
     r = _loader.downloadBitmap(_path, reqHeight); 

     Logger.i(getClass().getSimpleName(), "height: " + r.getHeight() + 
              "\nwidth: " + r.getWidth()); 
    } 

    return r; 
} 

public static int calculateInSampleSize(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; 

    while (height/inSampleSize > reqHeight || width/inSampleSize > reqWidth) 
    { 
     if (height > width) 
     { 
      inSampleSize = height/reqHeight; 
      if (((double)height % (double)reqHeight) != 0) 
      { 
       inSampleSize++; 
      } 
     } 
     else 
     { 
      inSampleSize = width/reqWidth; 
      if (((double)width % (double)reqWidth) != 0) 
      { 
       inSampleSize++; 
      } 
     } 
    } 
    return inSampleSize; 
} 
} 

Répondre

1

Vous pouvez donner la caméra le pointage uri vers fichier, vous voulez enregistrer l'image dans:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, mDefaultPhotoUri); // set path to image file 

Vous pouvez ensuite télécharger ce fichier sur votre serveur, afin que vous ayez la taille de bitmap complète. D'un autre côté, il n'y a aucun besoin (et sur beaucoup d'appareils) de décoder et d'afficher le bitmap 1920x1920 (ou similaire) dans l'interface utilisateur, c'est juste trop grand.

Espérons que cela aide.

+0

J'ai fini par trouver que l'erreur était plus loin dans le code que dans la tâche bitmap mais vous avez raison de ne pas avoir besoin d'afficher une image 1920X1920. Merci! –