Entonces, básicamente, lo que estoy tratando de lograr es abrir Gallery
en Android y dejar que el usuario seleccione multiple images
. Ahora bien, esta pregunta se ha hecho con frecuencia, pero no estoy satisfecho con las respuestas. Principalmente porque encontré algo interesante en los documentos en mi IDE (vuelvo a esto más tarde) y, por lo tanto, no quiero usar un adaptador personalizado sino solo 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 la gente de SO y otros sitios web le dirán que tiene 2 opciones:
1) No lo use ACTION_GET_CONTENT
sino en su 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, se abre una ventana 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 la gente consiguió esto con esta solución. ¿Me pierdo algo?
2) Implementar un custom Gallery
. Ahora bien, esta es mi última opción que consideraré porque, en mi humilde opinión, no es lo que estoy buscando porque tengo que diseñarlo yo mismo Y ¿por qué diablos no puedes seleccionar varias imágenes en la galería de vainilla?
Debe haber una opción para esto ... Ahora, lo interesante que encontré es esto:
Encontré esto en la descripción de los documentos ACTION_GET_CONTENT
.
Si la persona que llama puede manejar varios elementos devueltos (el usuario realiza una selección múltiple), entonces puede especificar EXTRA_ALLOW_MULTIPLE para indicar esto.
Esto es muy interesante. Aquí lo están refiriendo al caso de uso en el que un usuario puede seleccionar varios elementos.
Más adelante dicen en los documentos:
Puede utilizar 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 esto EXTRA_ALLOW_MULTIPLE
? Lo triste es que no puedo encontrar esto en ninguna parte de la guía developers.android y tampoco está definido como una constante en la clase INTENT.
¿Alguien puede ayudarme con esto EXTRA_ALLOW_MULTIPLE
?
fuente
EXTRA_ALLOW_MULTIPLE
permite seleccionar varios elementos. Obtenga los URI llamandogetClipData()
a la intención devuelta enonActivityResult
. El único problema es que el widget de la galería no permitirá la selección múltiple. En ese caso, al hacer clic en cualquier imagen, finalizará la selección y podrá obtener el URI (de un solo elemento) llamandogetData
a la intención devueltaRespuestas:
La opción EXTRA_ALLOW_MULTIPLE se establece en la intención a través del método Intent.putExtra ():
Su código anterior debería verse así:
Nota: la
EXTRA_ALLOW_MULTIPLE
opción solo está disponible en Android API 18 y versiones posteriores.fuente
Intent.getClipData
. Tiene la matriz de ClipData Item.Defina estas variables en la clase:
Supongamos que al hacer clic en un botón debería abrir la galería para seleccionar imágenes
Entonces debe anular el método onActivityResult
TENGA EN CUENTA QUE: la galería no le brinda la posibilidad de seleccionar múltiples imágenes, por lo que aquí abrimos el estudio de todas las imágenes para que pueda 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 debes verificar cuál es nulo para usar el otro
Deseo que tengas un buen intento y a los demás
fuente
Muchas de estas respuestas tienen similitudes pero a todas les falta la parte más importante
onActivityResult
, verifique sidata.getClipData
es nula antes de verificardata.getData
El código para llamar al selector de archivos:
El código para obtener todas las imágenes seleccionadas:
Tenga en cuenta que el selector de Android tiene Fotos y Galería disponibles en algunos dispositivos. Fotos permite seleccionar varias imágenes. La galería permite solo uno a la vez.
fuente
getData()
a veces NO será nulo, pero solo tendrá un Uri. Si desea controlar cuando un usuario selecciona varios archivos, verifiquegetClipData()
antesgetData()
: si los datos del clip no son nulos, es posible que el usuario haya seleccionado varias imágenes. Manejar getClipData antes de getData pero manejar ambos casos es importante para admitir diferentes dispositivos y, al mismo tiempo, permitir múltiples Uris.Espero que esta respuesta no sea tarde. Debido a que el widget de la galería no admite la selección múltiple de forma predeterminada, puede personalizar la vista de cuadrícula que aceptó su intención 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 :
del comentario de @ ilsy, CustomGalleryActivity en el uso de esta biblioteca
manageQuery
, que está en desuso, por lo que debería cambiarsegetContentResolver().query()
y darle mecursor.close()
gusta a esta respuestafuente
getContentResolver().query()
en el hilo de la interfaz de usuario. Lea sobre cargadores y biblioteca de soporte..cacheOnDisc()
también en desuso, así que.cacheOnDisc(true)
Inicializar instancia:
En onActivityResult tienes que escribir este bloque If-else 2. Uno para una sola imagen y otro para múltiples imágenes.
La parte más importante, obtener la ruta de la imagen de uri :
Espero que esto le pueda ayudar.
fuente
Obtuve nulo del
Cursor
. Luego encontró una solución para convertir elUri
enBitmap
que funciona perfectamente.Aquí está la solución que me funciona:
fuente
Hola, el código siguiente funciona bien.
Quieres más aclaraciones. http://mylearnandroid.blogspot.in/2014/02/multiple-choose-custom-gallery.html
fuente
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 hacer esto, por lo que decidí hacer un proyecto de código abierto. Es muy parecido a MultipleImagePick, pero es una mejor forma de implementarlo.
https://github.com/giljulio/android-multiple-image-picker
fuente
Prueba este IntentChooser . Solo agregue algunas líneas de código, yo hice el resto por usted.
PD: como se mencionó en las respuestas anteriores, EXTRA_ALLOW_MULTIPLE solo está disponible para API> = 18. Y algunas aplicaciones de galería no hacen que esta función esté disponible (Google Photos y Documents (
com.android.documentsui
) funcionan.fuente
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);