Sélectionnez plusieurs images de la galerie Android

Donc, en gros, ce que j’essaie de faire, c’est d’ouvrir la Gallery sous Android et de laisser l’utilisateur sélectionner multiple images . Maintenant, 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 de docs dans mon IDE (je reviens plus tard) et je ne veux donc pas utiliser un adaptateur personnalisé, mais juste un adaptateur vanille.

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

 Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent,"Select Picture"), 1); 

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

1) N’utilisez pas ACTION_GET_CONTENT mais ACTION_SEND_MULTIPLE place.
Celui-ci ne fonctionne pas. Celui-ci est selon les documents pour l’ sending fichiers et ne pas resortingeving et c’est exactement ce qu’il fait. Lors de l’utilisation de ACTION_SEND_MULTIPLE, j’ai ouvert une fenêtre sur mon appareil où je dois sélectionner une application à laquelle envoyer mes données. Ce n’est pas ce que je veux, alors je me demande comment les gens ont pu réaliser cela avec cette solution. Est-ce que quelque chose me manque?

2) Implémenter une custom Gallery . Maintenant, c’est ma dernière option que je considérerai car à mon humble avis ce n’est pas ce que je recherche parce que je dois le coiffer moi-même ET pourquoi diable vous ne pouvez pas sélectionner plusieurs images dans la galerie vanilla?

Il doit y avoir une option pour cela .. Maintenant, la chose intéressante que je trouve est la suivante:
Je l’ai trouvé dans la description de documents de ACTION_GET_CONTENT .

Si l’appelant peut gérer plusieurs éléments renvoyés (l’utilisateur effectuant une sélection multiple), il peut alors spécifier EXTRA_ALLOW_MULTIPLE pour l’indiquer.

C’est assez intéressant. Ici, ils le réfèrent au cas d’utilisation où un utilisateur peut sélectionner plusieurs éléments?

Plus tard, ils disent dans les docs:

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

Donc, c’est assez évident non? C’est ce dont j’ai besoin. Mais ma question suivante est: Où puis-je mettre ceci EXTRA_ALLOW_MULTIPLE ? Ce qui est sortingste, c’est que je ne peux pas trouver cela non dans le guide de developers.android et que ce n’est pas défini comme une constante dans la classe INTENT.

Quelqu’un peut-il m’aider avec cette EXTRA_ALLOW_MULTIPLE ?

    L’option EXTRA_ALLOW_MULTIPLE est définie sur l’intention via la méthode Intent.putExtra ():

     intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); 

    Votre code ci-dessus devrait ressembler à ceci:

     Intent intent = new Intent(); intent.setType("image/*"); intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent,"Select Picture"), 1); 

    Remarque: l’option EXTRA_ALLOW_MULTIPLE est uniquement disponible dans Android API 18 et versions ultérieures.

    Définissez ces variables dans la classe:

     int PICK_IMAGE_MULTIPLE = 1; Ssortingng imageEncoded; List imagesEncodedList; 

    Supposons que onClick sur un bouton, il devrait ouvrir la galerie pour sélectionner des images

      Intent intent = new Intent(); intent.setType("image/*"); intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent,"Select Picture"), PICK_IMAGE_MULTIPLE); 

    Ensuite, vous devez remplacer la méthode onActivityResult

     @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { try { // When an Image is picked if (requestCode == PICK_IMAGE_MULTIPLE && resultCode == RESULT_OK && null != data) { // Get the Image from data Ssortingng[] filePathColumn = { MediaStore.Images.Media.DATA }; imagesEncodedList = new ArrayList(); if(data.getData()!=null){ Uri mImageUri=data.getData(); // Get the cursor Cursor cursor = getContentResolver().query(mImageUri, filePathColumn, null, null, null); // Move to first row cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); imageEncoded = cursor.getSsortingng(columnIndex); cursor.close(); } 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(); mArrayUri.add(uri); // Get the cursor Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null); // Move to first row cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); imageEncoded = cursor.getString(columnIndex); imagesEncodedList.add(imageEncoded); cursor.close(); } Log.v("LOG_TAG", "Selected Images" + mArrayUri.size()); } } } else { Toast.makeText(this, "You haven't picked Image", Toast.LENGTH_LONG).show(); } } catch (Exception e) { Toast.makeText(this, "Something went wrong", Toast.LENGTH_LONG) .show(); } super.onActivityResult(requestCode, resultCode, data); } 

    NOTEZ QUE: la galerie ne vous permet pas de sélectionner des images multiples, nous ouvrons donc tous les studios d'images que vous pouvez sélectionner parmi plusieurs images. et n'oubliez pas d'append les permissions à votre manifeste

    TRES IMPORTANT: getData (); pour obtenir une seule image et je l'ai stocké ici dans imageEncoded Ssortingng si l'utilisateur sélectionne multi-images, alors ils doivent être stockés dans la liste

    Donc, vous devez vérifier qui est nul pour utiliser l'autre

    Je vous souhaite un bon essai et aux autres

    J’espère que cette réponse n’est pas en retard. Étant donné que le widget de la galerie ne prend pas en charge la sélection multiple par défaut, vous pouvez personnaliser la grid qui a accepté votre intention multi-sélection. L’autre option est d’étendre la vue de la galerie et d’append votre propre code pour permettre la sélection multiple.
    Ceci est la bibliothèque simple peut le faire: https://github.com/luminousman/MultipleImagePick

    Mise à jour :
    À partir du commentaire de @ ceux, CustomGalleryActivity dans cette bibliothèque utilise manageQuery , qui est obsolète, il devrait donc être remplacé par getContentResolver().query() et cursor.close() comme cette réponse

    Un grand nombre de ces réponses ont des similitudes, mais la partie la plus importante qui se trouve dans onActivityResult est onActivityResult : vérifiez si data.getClipData est nul avant de vérifier data.getData

    Le code pour appeler le sélecteur de fichier:

     Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); //allows any image file type. Change * to specific extension to limit it //**These following line is the important one! intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_PICTURES); //SELECT_PICTURES is simply a global int used to check the calling intent in onActivityResult 

    Le code pour obtenir toutes les images sélectionnées:

     @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == SELECT_PICTURES) { if(resultCode == Activity.RESULT_OK) { if(data.getClipData() != null) { int count = data.getClipData().getItemCount(); //evaluate the count before the for loop --- otherwise, the count is evaluated every loop. for(int i = 0; i < count; i++) Uri imageUri = data.getClipData().getItemAt(i).getUri(); //do something with the image (save it to some directory or whatever you need to do with it here) } } else if(data.getData() != null) { String imagePath = data.getData().getPath(); //do something with the image (save it to some directory or whatever you need to do with it here) } } } } 

    Notez que le sélecteur d'Android dispose de Photos et Galerie sur certains appareils. Photos permet de sélectionner plusieurs images. La galerie ne permet qu'un seul à la fois.

    Salut ci-dessous le code fonctionne très 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 précisions. http://mylearnandroid.blogspot.in/2014/02/multiple-choose-custom-gallery.html

    J’ai aussi eu le même problème. Je voulais aussi que les utilisateurs puissent prendre des photos facilement en choisissant des photos de la galerie. Impossible de trouver une manière native de le faire, j’ai donc décidé de faire un projet opensource. C’est un peu comme MultipleImagePick mais juste une meilleure façon de l’implémenter.

    https://github.com/giljulio/android-multiple-image-picker

     private static final RESULT_CODE_PICKER_IMAGES = 9000; Intent intent = new Intent(this, SmartImagePicker.class); startActivityForResult(intent, RESULT_CODE_PICKER_IMAGES); @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode){ case RESULT_CODE_PICKER_IMAGES: if(resultCode == Activity.RESULT_OK){ Parcelable[] parcelableUris = data.getParcelableArrayExtra(ImagePickerActivity.TAG_IMAGE_URI); //Java doesn't allow array casting, this is a little hack Uri[] uris = new Uri[parcelableUris.length]; System.arraycopy(parcelableUris, 0, uris, 0, parcelableUris.length); //Do something with the uris array } break; default: super.onActivityResult(requestCode, resultCode, data); break; } } 

    Essayez ceci IntentChooser . Ajoutez simplement des lignes de code, j’ai fait le rest pour vous.

     private void startImageChooserActivity() { Intent intent = ImageChooserMaker.newChooser(MainActivity.this) .add(new ImageChooser(true)) .create("Select Image"); startActivityForResult(intent, REQUEST_IMAGE_CHOOSER); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_IMAGE_CHOOSER && resultCode == RESULT_OK) { List imageUris = ImageChooserMaker.getPickMultipleImageResultUris(this, data); } } 

    PS: comme mentionné dans les réponses ci-dessus, EXTRA_ALLOW_MULTIPLE est uniquement disponible pour API> = 18. Certaines applications de galerie ne rendent pas cette fonctionnalité disponible (Google Photos et Documents ( com.android.documentsui ) fonctionnent).

    Initialiser l’instance

     private Ssortingng imagePath; private List imagePathList; 

    Dans onActivityResult Vous devez écrire ceci, bloc If-else 2. Un pour l’image unique et un autre pour l’image multiple.

     if (requestCode == GALLERY_CODE && resultCode == RESULT_OK && data != null){ imagePathList = new ArrayList<>(); if(data.getClipData() != null){ int count = data.getClipData().getItemCount(); for (int i=0; i 

    La partie la plus importante, Get Image Path from uri :

     public void getImageFilePath(Uri uri) { File file = new File(uri.getPath()); Ssortingng[] filePath = file.getPath().split(":"); Ssortingng image_id = filePath[filePath.length - 1]; Cursor cursor = getContentResolver().query(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, MediaStore.Images.Media._ID + " = ? ", new Ssortingng[]{image_id}, null); if (cursor!=null) { cursor.moveToFirst(); imagePath = cursor.getSsortingng(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); imagePathList.add(imagePath); cursor.close(); } } 

    J'espère que cela peut vous aider.

    Smart android gallery avec plusieurs actions de sélection d’images.

    Vérifiez la démo sur mon blog

    Tout d’abord, faites un bouton pour l’action et vous pouvez l’utiliser pour un seul / multiple

    Pour la sélection d’une image unique : – – luminous.ACTION_PICK pour choisir une image unique.

    Pour la sélection d’images multiples : – – luminous.ACTION_MULTIPLE_PICK pour choisir plusieurs images.

    sélection d'images multiples dans geekonjava Android

    MainActivity.java

     // For single image Intent i = new Intent(Action.ACTION_PICK); startActivityForResult(i, 100); // For multiple images Intent i = new Intent(Action.ACTION_MULTIPLE_PICK); startActivityForResult(i, 200); @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 100 && resultCode == Activity.RESULT_OK) { adapter.clear(); viewSwitcher.setDisplayedChild(1); Ssortingng single_path = data.getSsortingngExtra("single_path"); imageLoader.displayImage("file://" + single_path, imgSinglePick); } else if (requestCode == 200 && resultCode == Activity.RESULT_OK) { Ssortingng[] all_path = data.getSsortingngArrayExtra("all_path"); ArrayList dataT = new ArrayList(); for (Ssortingng ssortingng : all_path) { CustomGallery item = new CustomGallery(); item.sdcardPath = ssortingng; dataT.add(item); } viewSwitcher.setDisplayedChild(0); adapter.addAll(dataT); } } 

    Dans AndroidManifest.xml