Respuesta actualizada, casi 5 años después:
El código en la respuesta original ya no funciona de manera confiable, ya que las imágenes de varias fuentes a veces regresan con un URI de contenido diferente, es decir, en content://
lugar de hacerlo file://
. Una mejor solución es simplemente usar context.getContentResolver().openInputStream(intent.getData())
, ya que eso devolverá un InputStream que puede manejar a su elección.
Por ejemplo, BitmapFactory.decodeStream()
funciona perfectamente en esta situación, ya que también puede usar las opciones y el campo inSampleSize para reducir muestras de imágenes grandes y evitar problemas de memoria.
Sin embargo, cosas como Google Drive devuelven los URI a las imágenes que aún no se han descargado. Por lo tanto, debe realizar el código getContentResolver () en un subproceso en segundo plano.
Respuesta original:
Las otras respuestas explicaron cómo enviar la intención, pero no explicaron bien cómo manejar la respuesta. Aquí hay un código de muestra sobre cómo hacerlo:
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);
}
}
}
Después de esto, tiene la imagen seleccionada almacenada en "yourSelectedImage" para hacer lo que quiera. Este código funciona al obtener la ubicación de la imagen en la base de datos ContentResolver, pero eso por sí solo no es suficiente. Cada imagen tiene aproximadamente 18 columnas de información, que van desde su ruta de archivo hasta la 'última fecha de modificación' hasta las coordenadas GPS de donde se tomó la foto, aunque muchos de los campos no se utilizan realmente.
Para ahorrar tiempo, ya que no necesita los otros campos, la búsqueda del cursor se realiza con un filtro. El filtro funciona especificando el nombre de la columna que desea, MediaStore.Images.Media.DATA, que es la ruta, y luego asigna esa cadena [] a la consulta del cursor. La consulta del cursor regresa con la ruta, pero no sabe en qué columna está hasta que usa el columnIndex
código. Eso simplemente obtiene el número de la columna en función de su nombre, el mismo utilizado en el proceso de filtrado. Una vez que tienes eso, finalmente puedes decodificar la imagen en un mapa de bits con la última línea de código que di.