Seleccione varias imágenes de la galería de Android

Básicamente, lo que bash lograr es abrir la Gallery en Android y dejar que el usuario seleccione multiple images . Ahora esta pregunta se ha hecho con frecuencia, pero no estoy satisfecho con las respuestas. Principalmente porque encontré algo interesante en documentos en mi IDE (vuelvo a esto más adelante) y, por lo tanto, no quiero usar un adaptador personalizado, sino simplemente el estándar.

Ahora mi código para seleccionar una imagen es:

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

Ahora People on SO y otros sitios web le dirán que tiene 2 opciones:

1) No use ACTION_GET_CONTENT pero ACTION_SEND_MULTIPLE en ACTION_SEND_MULTIPLE lugar.
Este no funciona Este es de acuerdo con los documentos para sending archivos y no retrieving y eso es exactamente lo que hace. Cuando uso ACTION_SEND_MULTIPLE, recibí una ventana abierta en mi dispositivo donde tengo que seleccionar una aplicación para enviar mis datos. Eso no es lo que quiero, así que me pregunto cómo logró esto la gente con esta solución. ¿Extraño algo?

2) Implementar una custom Gallery . Ahora esta es mi última opción que consideraré porque no es lo que estoy buscando porque tengo que diseñarlo yo mismo Y ¿por qué diablos no puedes seleccionar múltiples imágenes en la galería de vanilla?

Debe haber una opción para esto … Ahora lo interesante que he encontrado es esto:
Encontré esto en la descripción de documentos de ACTION_GET_CONTENT .

Si la persona que llama puede manejar múltiples elementos devueltos (el usuario que realiza una selección múltiple), entonces puede especificar EXTRA_ALLOW_MULTIPLE para indicar esto.

Esto es bastante interesante. Aquí lo están refiriendo al caso de uso en el que un usuario puede seleccionar varios elementos.

Más tarde dicen en los documentos:

Puede usar EXTRA_ALLOW_MULTIPLE para permitir que el usuario seleccione varios elementos.

Entonces esto es bastante obvio ¿verdad? Esto es lo que necesito. Pero mi siguiente pregunta es: ¿Dónde puedo poner este EXTRA_ALLOW_MULTIPLE ? Lo triste es que no puedo encontrar esto en ningún lugar de la guía developers.android y tampoco está definido como una constante en la clase INTENT.

¿Alguien puede ayudarme con este EXTRA_ALLOW_MULTIPLE ?

La opción EXTRA_ALLOW_MULTIPLE se establece en la intención a través del método Intent.putExtra ():

 intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); 

Su código anterior debería verse así:

 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); 

Nota: la opción EXTRA_ALLOW_MULTIPLE solo está disponible en Android API 18 y versiones posteriores.

Defina estas variables en la clase:

 int PICK_IMAGE_MULTIPLE = 1; String imageEncoded; List imagesEncodedList; 

Supongamos que al hacer clic en un botón, debe abrir la galería para seleccionar imágenes

  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); 

Entonces debes anular el método de prueba de actividad

 @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 String[] 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.getString(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); } 

TEN EN CUENTA QUE: la galería no te brinda la posibilidad de seleccionar múltiples imágenes, por lo que aquí abrimos todas las imágenes del estudio para que puedas seleccionar múltiples imágenes de ellas. y no olvides agregar los permisos a tu manifiesto

MUY IMPORTANTE: getData (); para obtener una sola imagen y la he almacenado aquí en imageEncoded String si el usuario selecciona múltiples imágenes, entonces deben almacenarse en la lista

Entonces, debe verificar cuál es nulo para usar el otro

Ojalá tengas un buen bash y para los demás

Espero que esta respuesta no sea tarde. Debido a que el widget de galería no admite la selección múltiple de forma predeterminada, puede personalizar la vista de cuadrícula que acepta su bash de selección múltiple. La otra opción es ampliar la vista de la galería y agregar su propio código para permitir la selección múltiple.
Esta es la biblioteca simple que puede hacerlo: https://github.com/luminousman/MultipleImagePick

Actualización :
Desde el comentario de @ ilsy, CustomGalleryActivity en esta biblioteca usa manageQuery , que está en desuso, por lo que debe cambiarse a getContentResolver().query() y cursor.close() como esta respuesta

Muchas de estas respuestas tienen similitudes pero todas faltan la parte más importante que está en onActivityResult , verifique si data.getClipData es nulo antes de verificar data.getData

El código para llamar al selector de archivos:

 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 

El código para obtener todas las imágenes seleccionadas:

 @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) } } } } 

Tenga en cuenta que el selector de Android tiene fotos y una galería disponibles en algunos dispositivos. Fotos permite seleccionar múltiples imágenes. Galería permite solo uno a la vez.

Hola, el código está funcionando 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); 

Quieres más aclaraciones http://mylearnandroid.blogspot.in/2014/02/multiple-choose-custom-gallery.html

También tuve el mismo problema. También quería que los usuarios pudieran tomar fotos fácilmente mientras seleccionaban fotos de la galería. No pude encontrar una forma nativa de hacerlo, por lo tanto, decidí hacer un proyecto de código abierto. Es muy parecido a MultipleImagePick pero es la mejor forma de implementarlo.

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[] plotbleUris = data.getParcelableArrayExtra(ImagePickerActivity.TAG_IMAGE_URI); //Java doesn't allow array casting, this is a little hack Uri[] uris = new Uri[plotbleUris.length]; System.arraycopy(plotbleUris, 0, uris, 0, plotbleUris.length); //Do something with the uris array } break; default: super.onActivityResult(requestCode, resultCode, data); break; } } 

Prueba este IntentChooser . Solo agrega algunas líneas de código, hice el rest por ti.

 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); } } 

PD: como se menciona en las respuestas anteriores, EXTRA_ALLOW_MULTIPLE solo está disponible para API> = 18. Y algunas aplicaciones de galería no hacen que esta característica esté disponible (Google Fotos y documentos ( com.android.documentsui ) funcionan.

Inicializar instancia:

 private String imagePath; private List imagePathList; 

En onActivityResult Tienes que escribir esto, If-else 2 block. Uno para una sola imagen y otro para una imagen múltiple.

 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 parte más importante, Get Image Path from uri :

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

Espero que esto le pueda ayudar.

Galería inteligente de Android con múltiples acciones de selección de imágenes.

Verifica la demo en mi blog

En primer lugar, haga clic en el botón de acción y puede usarlo para single / multiple

Para la selección de una sola imagen : – – luminous.ACTION_PICK para elegir una sola imagen.

Para la selección de imágenes múltiples : – – luminous.ACTION_MULTIPLE_PICK para elegir imágenes múltiples.

selección múltiple de imágenes en geekonjava para 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); String single_path = data.getStringExtra("single_path"); imageLoader.displayImage("file://" + single_path, imgSinglePick); } else if (requestCode == 200 && resultCode == Activity.RESULT_OK) { String[] all_path = data.getStringArrayExtra("all_path"); ArrayList dataT = new ArrayList(); for (String string : all_path) { CustomGallery item = new CustomGallery(); item.sdcardPath = string; dataT.add(item); } viewSwitcher.setDisplayedChild(0); adapter.addAll(dataT); } } 

En AndroidManifest.xml