142 votes

Sélectionnez plusieurs images dans la galerie Android

En gros, ce que j'essaie de faire, c'est d'ouvrir la Galerie sur Android et de permettre à l'utilisateur de sélectionner plusieurs images. Cette question a été posée fréquemment, mais je ne suis pas satisfait des réponses. Principalement parce que j'ai trouvé quelque chose d'intéressant dans la documentation de mon IDE (je reviendrai là-dessus plus tard) et donc je ne veux pas utiliser un adaptateur personnalisé mais juste celui par défaut.

Maintenant, mon code pour sélectionner une seule image est le suivant :

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Sélectionnez une image"), 1);

Maintenant, les gens sur SO et d'autres sites vous diront que vous avez 2 options :

1) Ne pas utiliser ACTION_GET_CONTENT mais plutôt ACTION_SEND_MULTIPLE à la place.
Cela ne fonctionne pas. Cela est selon la documentation pour envoyer des fichiers et non récupérer et c'est exactement ce qu'il fait. Lorsque j'utilise ACTION_SEND_MULTIPLE, une fenêtre s'ouvre sur mon appareil où je dois sélectionner une application pour envoyer mes données. Ce n'est pas ce que je veux, donc je me demande comment les gens ont réussi à le faire avec cette solution... Est-ce que je manque quelque chose ?

2) Implémenter une Galerie personnalisée. C'est ma dernière option que je considérerai car à mon avis, ce n'est pas ce que je recherche car je dois styliser moi-même ET pourquoi diable vous ne pouvez pas simplement sélectionner plusieurs images dans la galerie par défaut ?

Il doit y avoir une option pour cela... Maintenant, la chose intéressante que j'ai trouvée est la suivante :
_J'ai trouvé cela dans la description de ACTION_GET_CONTENT._

Si l'appelant peut gérer plusieurs éléments retournés (l'utilisateur effectue une sélection multiple), il peut spécifier EXTRA_ALLOW_MULTIPLE pour l'indiquer.

C'est assez intéressant. Ils y font référence au cas d'utilisation où un utilisateur peut sélectionner plusieurs éléments, non ?

Plus tard, ils disent dans la documentation :

Vous pouvez utiliser EXTRA_ALLOW_MULTIPLE pour permettre à l'utilisateur de sélectionner plusieurs éléments.

Donc c'est assez évident, n'est-ce pas ? C'est ce dont j'ai besoin. Mais ma question suivante est : Où puis-je mettre ce EXTRA_ALLOW_MULTIPLE ? La triste chose est que je ne le trouve nulle part dans le guide des développeurs Android et ce n'est pas non plus défini comme une constante dans la classe INTENT.

Est-ce que quelqu'un peut m'aider avec ce EXTRA_ALLOW_MULTIPLE ?

7voto

Vince Points 502

2022 - La manière Android Jetpack Compose

Pour sélectionner plusieurs images dans la galerie avec Android Jetpack Compose.

val launcherMultipleImages = rememberLauncherForActivityResult(
    contract = ActivityResultContracts.GetMultipleContents(),
) { uriList: List ->
    // TODO
}

Et ensuite utiliser launcherMultipleImages.launch("image/*") pour démarrer la sélection d'images.

Par exemple :

Button(onClick = { launcherMultipleImages.launch("image/*") }) {
    Text(text = "Sélectionner des images")
}

3voto

doli Points 63

Cela fonctionne pour la sélection de plusieurs images. également testé dans l'API 29,30 dans Google photos.

private static final int PICK_IMAGE = 2;

Intent intent = new Intent(Intent.ACTION_PICK, 
    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
                startActivityForResult(Intent.createChooser(intent, "Sélectionner 
    des images"),PICK_IMAGE);

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE && resultCode == RESULT_OK) {
        if(data.getClipData() != null) {
            int count = data.getClipData().getItemCount();
            for(int i = 0; i < count; i++) {
            Uri imageUri = data.getClipData().getItemAt(i).getUri();
            //faire ce que vous voulez faire
            }
        }
        else if(data.getData() != null) {
            Uri selectedImageUri = data.getData();
            //faire ce que vous voulez faire
        }
}

3voto

Ahmet Points 266

Définissez le contenu comme suit ;

val getContent = registerForActivityResult(ActivityResultContracts.GetMultipleContents()) 
{ uriList ->
    // todo
}

Après avoir accordé l'autorisation associée, exécutez le code suivant

getContent.launch("image/*")

C'est l'un des moyens les plus simples de choisir n'importe quelle donnée.

1voto

Sudarshan Points 437

J'ai reçu null du Cursor. Ensuite, j'ai trouvé une solution pour convertir l'Uri en Bitmap qui fonctionne parfaitement.

Voici la solution qui fonctionne pour moi:

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

    if (resultCode == Activity.RESULT_OK) {

        if (requestCode == VOTRE_CODE_DE_DEMANDE) {

            if (data != null) {

                if (data.getData() != null) {

                    Uri contentURI = data.getData();
                    ex_one.setImageURI(contentURI);

                    Log.d(TAG, "onActivityResult: " + contentURI.toString());
                    try {

                        Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), contentURI);

                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                } else {

                    if (data.getClipData() != null) {
                        ClipData mClipData = data.getClipData();
                        ArrayList mArrayUri = new ArrayList();
                        for (int i = 0; i < mClipData.getItemCount(); i++) {

                            ClipData.Item item = mClipData.getItemAt(i);
                            Uri uri = item.getUri();
                            try {
                                Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), uri);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }

                        }
                    }

                }

            }

        }

    }

}

0voto

Bonjour, le code ci-dessous fonctionne bien.

 Cursor imagecursor1 = managedQuery(
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null,
    null, orderBy + " DESC");

   this.imageUrls = new ArrayList();
  imageUrls.size();

   for (int i = 0; i < imagecursor1.getCount(); i++) {
   imagecursor1.moveToPosition(i;
   int dataColumnIndex = imagecursor1
     .getColumnIndex(MediaStore.Images.Media.DATA);
   imageUrls.add(imagecursor1.getString(dataColumnIndex));
  }

   options = new DisplayImageOptions.Builder()
  .showStubImage(R.drawable.stub_image)
  .showImageForEmptyUri(R.drawable.image_for_empty_url)
  .cacheInMemory().cacheOnDisc().build();

   imageAdapter = new ImageAdapter(this, imageUrls);

   gridView = (GridView) findViewById(R.id.PhoneImageGrid);
  gridView.setAdapter(imageAdapter);

Vous voulez plus de clarifications. http://mylearnandroid.blogspot.in/2014/02/multiple-choose-custom-gallery.html

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