348 votes

Comment choisir une image de la galerie (carte SD) pour mon application sous Android ?

Cette question a été posée à l'origine pour Android 1.6.

Je travaille sur les options de photos dans mon application.

J'ai un bouton et une ImageView dans mon activité. Lorsque je clique sur le bouton, je suis redirigé vers la galerie et je peux sélectionner une image. L'image sélectionnée apparaîtrait dans mon ImageView.

Comment faire ? Vous avez des idées ?

419voto

Steve Haley Points 26928

Les autres réponses expliquaient comment envoyer l'intention, mais elles n'expliquaient pas bien comment traiter la réponse. Voici un exemple de code sur la façon de le faire :

protected void onActivityResult(int requestCode, int resultCode, 
       Intent imageReturnedIntent) {
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 

    switch(requestCode) { 
    case REQ_CODE_PICK_IMAGE:
        if(resultCode == RESULT_OK){  
            Uri selectedImage = imageReturnedIntent.getData();
            String[] filePathColumn = {MediaStore.Images.Media.DATA};

            Cursor cursor = getContentResolver().query(
                               selectedImage, filePathColumn, null, null, null);
            cursor.moveToFirst();

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String filePath = cursor.getString(columnIndex);
            cursor.close();

            Bitmap yourSelectedImage = BitmapFactory.decodeFile(filePath);
        }
    }
}

Après cela, vous avez l'image sélectionnée stockée dans "yourSelectedImage" pour faire ce que vous voulez avec. Ce code fonctionne en récupérant l'emplacement de l'image dans la base de données du ContentResolver, mais cela ne suffit pas. Chaque image comporte environ 18 colonnes d'informations, allant du chemin d'accès au fichier à la date de dernière modification, en passant par les coordonnées GPS du lieu où la photo a été prise, bien que de nombreux champs ne soient pas réellement utilisés.

Pour gagner du temps car vous n'avez pas réellement besoin des autres champs, la recherche de curseur se fait avec un filtre. Le filtre fonctionne en spécifiant le nom de la colonne que vous voulez, MediaStore.Images.Media.DATA, qui est le chemin, puis en donnant cette chaîne[] à la requête du curseur. La requête du curseur renvoie le chemin d'accès, mais vous ne savez pas dans quelle colonne il se trouve tant que vous n'utilisez pas la fonction columnIndex code. Il récupère simplement le numéro de la colonne en fonction de son nom, le même que celui utilisé dans le processus de filtrage. Une fois que vous avez obtenu cela, vous êtes enfin en mesure de décoder l'image en un bitmap avec la dernière ligne de code que j'ai donné.

317voto

siamii Points 5133
private static final int SELECT_PHOTO = 100;

Intention de départ

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, SELECT_PHOTO);    

Résultat du processus

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 

    switch(requestCode) { 
    case SELECT_PHOTO:
        if(resultCode == RESULT_OK){  
            Uri selectedImage = imageReturnedIntent.getData();
            InputStream imageStream = getContentResolver().openInputStream(selectedImage);
            Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream);
        }
    }
}

Vous pouvez également sous-échantillonner votre image pour éviter les erreurs OutOfMemory.

private Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException {

        // Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, o);

        // The new size we want to scale to
        final int REQUIRED_SIZE = 140;

        // Find the correct scale value. It should be the power of 2.
        int width_tmp = o.outWidth, height_tmp = o.outHeight;
        int scale = 1;
        while (true) {
            if (width_tmp / 2 < REQUIRED_SIZE
               || height_tmp / 2 < REQUIRED_SIZE) {
                break;
            }
            width_tmp /= 2;
            height_tmp /= 2;
            scale *= 2;
        }

        // Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        return BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, o2);

    }

87voto

Robby Pond Points 37875

Vous devez commencer la galerie avec l'intention d'obtenir un résultat.

Intent i = new Intent(Intent.ACTION_PICK,
               android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, ACTIVITY_SELECT_IMAGE); 

Ensuite, dans onActivityForResult appel intent.getData() pour obtenir l'Uri de l'image. Ensuite, vous devez récupérer l'image à partir du ContentProvider.

14voto

mbaird Points 31293

Faites-le pour lancer la galerie et permettre à l'utilisateur de choisir une image :

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, IMAGE_PICK);

Alors dans votre onActivityResult() utilisez l'URI de l'image renvoyée pour définir l'image de votre ImageView.

11voto

Sheetal More Points 102
public class EMView extends Activity {
ImageView img,img1;
int column_index;
  Intent intent=null;
// Declare our Views, so we can access them later
String logo,imagePath,Logo;
Cursor cursor;
//YOU CAN EDIT THIS TO WHATEVER YOU WANT
private static final int SELECT_PICTURE = 1;

 String selectedImagePath;
//ADDED
 String filemanagerstring;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    img= (ImageView)findViewById(R.id.gimg1);

    ((Button) findViewById(R.id.Button01))
    .setOnClickListener(new OnClickListener() {

        public void onClick(View arg0) {

            // in onCreate or any event where your want the user to
            // select a file
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(Intent.createChooser(intent,
                    "Select Picture"), SELECT_PICTURE);

        }
    });
}

//UPDATED
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == Activity.RESULT_OK) {
        if (requestCode == SELECT_PICTURE) {
            Uri selectedImageUri = data.getData();

            //OI FILE Manager
            filemanagerstring = selectedImageUri.getPath();

            //MEDIA GALLERY
            selectedImagePath = getPath(selectedImageUri);

            img.setImageURI(selectedImageUri);

           imagePath.getBytes();
           TextView txt = (TextView)findViewById(R.id.title);
           txt.setText(imagePath.toString());

           Bitmap bm = BitmapFactory.decodeFile(imagePath);

          // img1.setImageBitmap(bm);

        }

    }

}

//UPDATED!
public String getPath(Uri uri) {
String[] projection = { MediaColumns.DATA };
Cursor cursor = managedQuery(uri, projection, null, null, null);
column_index = cursor
        .getColumnIndexOrThrow(MediaColumns.DATA);
cursor.moveToFirst();
 imagePath = cursor.getString(column_index);

return cursor.getString(column_index);
}

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X