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 de file://
. Uma solução melhor é simplesmente usar context.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:
protected void onActivityResult(int requestCode, int resultCode,
Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
switch(requestCode) {
case REQ_CODE_PICK_IMAGE:
if(resultCode == RESULT_OK){
Uri selectedImage = imageReturnedIntent.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(
selectedImage, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String filePath = cursor.getString(columnIndex);
cursor.close();
Bitmap yourSelectedImage = BitmapFactory.decodeFile(filePath);
}
}
}
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.