Então, basicamente o que estou tentando alcançar é abrir o Gallery
no Android e deixar o usuário selecionar multiple images
. Agora, esta pergunta tem sido feita com frequência, mas não estou satisfeito com as respostas. Principalmente porque encontrei algo interessante nos de docs em meu IDE (volto sobre isso mais tarde) e, portanto, não quero usar um adaptador personalizado, mas apenas o vanilla.
Agora, meu código para selecionar uma imagem é:
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Picture"), 1);
Agora, as pessoas no SO e em outros sites dirão que você tem 2 opções:
1) Não use, ACTION_GET_CONTENT
mas ACTION_SEND_MULTIPLE
sim.
Este não funciona. Este está de acordo com a documentação para sending
arquivos e não retrieving
e é exatamente o que faz. Ao usar o ACTION_SEND_MULTIPLE, abri uma janela no meu dispositivo onde devo selecionar um aplicativo para enviar meus dados. Não é isso que eu quero, então me pergunto como as pessoas conseguiram isso com essa solução. Eu sinto falta de alguma coisa?
2) Implementar um custom Gallery
. Agora, esta é a minha última opção que vou considerar porque imho não é o que estou procurando porque tenho que estilizá-lo sozinho E por que diabos você simplesmente não pode selecionar várias imagens na galeria vanilla?
Deve haver uma opção para isso .. Agora o que é interessante o que eu encontrei é o seguinte:
Eu achei isso na descrição da documentação do ACTION_GET_CONTENT
.
Se o chamador puder lidar com vários itens retornados (o usuário executando várias seleções), ele pode especificar EXTRA_ALLOW_MULTIPLE para indicar isso.
Isso é muito interessante. Aqui, eles se referem ao caso de uso em que um usuário pode selecionar vários itens?
Mais tarde, eles dizem na documentação:
Você pode usar EXTRA_ALLOW_MULTIPLE para permitir que o usuário selecione vários itens.
Então, isso é bastante óbvio, certo? Isto é o que eu preciso. Mas minha seguinte pergunta é: Onde posso colocar isso EXTRA_ALLOW_MULTIPLE
? O triste é que não consigo encontrar isso em nenhum lugar no guia developers.android e também não é definido como uma constante na classe INTENT.
Alguém pode me ajudar com isso EXTRA_ALLOW_MULTIPLE
?
fonte
EXTRA_ALLOW_MULTIPLE
permite que você selecione vários itens. Obtenha os URIs chamando ogetClipData()
intent retornado emonActivityResult
. O único problema é que o widget da galeria não permite a seleção múltipla. Nesse caso, clicar em qualquer imagem encerrará a seleção e você poderá obter o URI (do item único) chamandogetData
na intenção retornadaRespostas:
A opção EXTRA_ALLOW_MULTIPLE é definida no intent por meio do método Intent.putExtra ():
Seu código acima deve ser semelhante a este:
Nota: a
EXTRA_ALLOW_MULTIPLE
opção está disponível apenas no Android API 18 e superior.fonte
Intent.getClipData
. Ele tem a matriz de ClipData Item.Defina essas variáveis na classe:
Vamos supor que onClick em um botão deve abrir a galeria para selecionar imagens
Então você deve substituir o método onActivityResult
NOTE QUE: a galeria não oferece a capacidade de selecionar várias imagens, portanto, aqui abrimos todos os estúdios de imagens em que você pode selecionar várias imagens. e não se esqueça de adicionar as permissões ao seu manifesto
MUITO IMPORTANTE: getData (); para obter uma única imagem e eu a armazenei aqui em imageEncoded String se o usuário selecionar várias imagens, então elas devem ser armazenadas na lista
Então você tem que verificar qual é nulo para usar o outro
Desejo que você tenha uma boa tentativa e para os outros
fonte
Muitas dessas respostas têm semelhanças, mas estão faltando a parte mais importante que está
onActivityResult
, verifique sedata.getClipData
é nulo antes de verificardata.getData
O código para chamar o seletor de arquivos:
O código para obter todas as imagens selecionadas:
Observe que o seletor do Android tem Fotos e Galeria disponíveis em alguns dispositivos. Fotos permite que várias imagens sejam selecionadas. A galeria permite apenas um de cada vez.
fonte
getData()
às vezes NÃO será nulo, mas terá apenas um Uri. Se você deseja controlar quando um usuário seleciona vários arquivos, verifiquegetClipData()
antesgetData()
- se os dados do clipe não forem nulos, o usuário pode ter selecionado várias imagens. O manuseio de getClipData antes de getData, mas o manuseio de ambos os casos, é importante para oferecer suporte a diferentes dispositivos e, ao mesmo tempo, permitir vários Uris.Espero que essa resposta não seja tarde. Porque o widget da galeria não suporta seleção múltipla por padrão, mas você pode customizar o gridview que aceitou sua intenção multisseleção. A outra opção é estender a visualização da galeria e adicionar seu próprio código para permitir a seleção múltipla.
Esta é a biblioteca simples que pode fazer: https://github.com/luminousman/MultipleImagePick
Atualização :
A partir de @ ilsy comentário, CustomGalleryActivity neste uso da biblioteca
manageQuery
, que está obsoleto, por isso deve ser alterado paragetContentResolver().query()
ecursor.close()
como esta respostafonte
getContentResolver().query()
em thread de interface do usuário. Leia sobre Carregadores e Biblioteca de Suporte..cacheOnDisc()
também descontinuado, portanto, altere-o para.cacheOnDisc(true)
com parâmetro booleanoInicializar instância:
Em onActivityResult, você deve escrever este bloco If-else 2. Um para uma única imagem e outro para várias imagens.
A parte mais importante, obter o caminho da imagem do uri :
Espero que isso possa ajudá-lo.
fonte
Eu obtive null do
Cursor
. Então encontrei uma solução para converter oUri
emBitmap
que funcione perfeitamente.Aqui está a solução que funciona para mim:
fonte
O código abaixo está funcionando bem.
Você quer mais esclarecimentos. http://mylearnandroid.blogspot.in/2014/02/multiple-choose-custom-gallery.html
fonte
Eu também tive o mesmo problema. Eu também queria que os usuários pudessem tirar fotos facilmente enquanto escolhem as fotos da galeria. Não consegui encontrar uma maneira nativa de fazer isso, portanto decidi fazer um projeto de código aberto. É muito parecido com MultipleImagePick, mas apenas uma maneira melhor de implementá-lo.
https://github.com/giljulio/android-multiple-image-picker
fonte
Experimente este IntentChooser . Basta adicionar algumas linhas de código, eu fiz o resto para você.
PS: conforme mencionado nas respostas acima, EXTRA_ALLOW_MULTIPLE está disponível apenas para API> = 18. E alguns aplicativos de galeria não disponibilizam esse recurso (Google Fotos e Documentos (
com.android.documentsui
) funcionam.fonte
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);