Esta pergunta foi originalmente feita para Android 1.6.
Estou trabalhando nas opções de fotos no meu aplicativo.
Eu tenho um botão e um ImageView na minha atividade. Quando clico no botão, ele é redirecionado para a galeria e eu posso selecionar uma imagem. A imagem selecionada apareceria no meu ImageView.
android
android-image
android-gallery
Praveen
fonte
fonte
Respostas:
Resposta atualizada, quase 5 anos depois:
O código na resposta original não funciona mais de maneira confiável, pois imagens de várias fontes às vezes retornam com um URI de conteúdo diferente, ou seja, em
content://
vez defile://
. Uma solução melhor é simplesmente usarcontext.getContentResolver().openInputStream(intent.getData())
, pois isso retornará um InputStream que você pode manipular conforme desejar.Por exemplo,
BitmapFactory.decodeStream()
funciona perfeitamente nessa situação, pois você também pode usar o campo Opções e inSampleSize para reduzir a amostragem de imagens grandes e evitar problemas de memória.No entanto, coisas como o Google Drive retornam URIs para imagens que ainda não foram realmente baixadas. Portanto, você precisa executar o código getContentResolver () em um encadeamento em segundo plano.
Resposta original:
As outras respostas explicaram como enviar a intenção, mas não explicaram bem como lidar com a resposta. Aqui está um exemplo de código sobre como fazer isso:
Depois disso, você terá a imagem selecionada armazenada em "yourSelectedImage" para fazer o que quiser. Esse código funciona obtendo a localização da imagem no banco de dados ContentResolver, mas isso por si só não é suficiente. Cada imagem possui cerca de 18 colunas de informações, desde o caminho do arquivo até a data da última modificação, até as coordenadas GPS de onde a foto foi tirada, embora muitos dos campos não sejam realmente usados.
Para economizar tempo, já que você não precisa dos outros campos, a pesquisa do cursor é feita com um filtro. O filtro funciona especificando o nome da coluna desejada, MediaStore.Images.Media.DATA, que é o caminho e, em seguida, atribuindo essa sequência [] à consulta do cursor. A consulta do cursor retorna com o caminho, mas você não sabe em qual coluna está até usar o
columnIndex
código. Isso simplesmente obtém o número da coluna com base em seu nome, o mesmo usado no processo de filtragem. Quando você conseguir isso, finalmente poderá decodificar a imagem em um bitmap com a última linha de código que eu forneci.fonte
Intenção de início
Resultado do processo
Como alternativa, você também pode reduzir a amostra da imagem para evitar erros de OutOfMemory.
fonte
int scale = 1; for ( ; bfOptions.outWidth / scale > TARGET_SIZE && bfOptions.outWidth > TARGET_SIZE; scale*=2);
Você precisa iniciar a intenção da galeria para obter um resultado.
Em seguida
onActivityForResult
, ligueintent.getData()
para obter o Uri da imagem. Então você precisa obter a imagem do ContentProvider.fonte
Aqui está um código testado para imagem e vídeo. Ele funcionará para todas as APIs com menos de 19 e maiores que 19 também.
Imagem:
Vídeo:
.
fonte
Faça isso para iniciar a galeria e permitir que o usuário escolha uma imagem:
Em seu
onActivityResult()
uso, o URI da imagem retornada para definir a imagem no seu ImageView.fonte
fonte
fonte
Por algumas razões, todas as respostas neste tópico, na
onActivityResult()
tentativa de pós-processar o recebidoUri
, como obter o caminho real da imagem e depois usáBitmapFactory.decodeFile(path)
-lo para obter oBitmap
.Esta etapa é desnecessária. A
ImageView
classe tem um método chamadosetImageURI(uri)
. Passe seu uri para ele e você deve terminar.Para um exemplo de trabalho completo, você pode dar uma olhada aqui: http://androidbitmaps.blogspot.com/2015/04/loading-images-in-android-part-iii-pick.html
PS:
Obter
Bitmap
uma variável separada faria sentido nos casos em que a imagem a ser carregada é muito grande para caber na memória, e é necessária uma operação de redução para evitarOurOfMemoryError
, como mostrado na resposta @siamii.fonte
chame o método chooseImage como
fonte
fonte