51 votes

Android : permet à l'utilisateur de choisir une image ou une vidéo dans la galerie

Est-il possible de démarrer Gallery de manière à afficher à la fois les images et les vidéos ?

Merci

66voto

Elenasys Points 23268

Choisissez le fichier audio dans la galerie :

 //Use MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);

Choisissez le fichier vidéo dans la galerie :

 //Use MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI);

Choisissez l'image dans la galerie :

 //Use  MediaStore.Images.Media.EXTERNAL_CONTENT_URI
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

Choisissez des fichiers multimédias ou des images :

  Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/* video/*");

54voto

Siavash Points 406

Vous démarrez la galerie en tant que tel :

 Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
pickIntent.setType("image/* video/*");
startActivityForResult(pickIntent, IMAGE_PICKER_SELECT);

Ensuite, dans votre onActivityResult vous pouvez vérifier si la vidéo ou l'image a été sélectionnée en procédant comme suit :

 public void onActivityResult(int requestCode, int resultCode, Intent data) {

if (resultCode == RESULT_OK) {
    Uri selectedMediaUri = data.getData();
    if (selectedMediaUri.toString().contains("image")) {
        //handle image
    } else  if (selectedMediaUri.toString().contains("video")) {
        //handle video
    }
}

27voto

Fen1kz Points 686

(EDIT : je ne m'en sers plus, nous sommes revenus sur les deux choix "choisir image" et "choisir vidéo". Le problème venait de certains téléphone Sony. Donc, ce n'est pas une solution à 100% ci-dessous, attention !)

C'est ce que j'utilise :

 if (Build.VERSION.SDK_INT < 19) {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("image/* video/*");
    startActivityForResult(Intent.createChooser(intent, getResources().getString(R.string.select_picture)), SELECT_GALLERY);
} else {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("image/*");
    intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] {"image/*", "video/*"});
    startActivityForResult(intent, SELECT_GALLERY_KITKAT);
}

La clé ici est intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] {"image/*", "video/*"});

11voto

Maurycy Points 1398
intent.setType("*/*");

Cela présente à l'utilisateur une boîte de dialogue mais fonctionne au moins sur ICS. Pas testé sur d'autres plateformes.

7voto

Pit0r Points 140

Lorsque vous devez déterminer le type de contenu renvoyé, vous pouvez le faire à l'aide du résolveur de contenu pour obtenir le type MIME du contenu renvoyé :

 if( data != null) {
    Uri selectedUri = data.getData();   
    String[] columns = { MediaStore.Images.Media.DATA,
                         MediaStore.Images.Media.MIME_TYPE };

    Cursor cursor = getContentResolver().query(selectedUri, columns, null, null, null);
    cursor.moveToFirst();

    int pathColumnIndex     = cursor.getColumnIndex( columns[0] );
    int mimeTypeColumnIndex = cursor.getColumnIndex( columns[1] );

    String contentPath = cursor.getString(pathColumnIndex);
    String mimeType    = cursor.getString(mimeTypeColumnIndex);
    cursor.close();

    if(mimeType.startsWith("image")) {
          //It's an image
    }
    else if(mimeType.startsWith("video")) {
         //It's a video
    }       
}
else {
    // show error or do nothing
}

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