Esta pregunta se hizo originalmente para Android 1.6.
Estoy trabajando en las opciones de fotos en mi aplicación.
Tengo un botón y un ImageView en mi actividad. Cuando hago clic en el botón, redirigiría a la galería y podría seleccionar una imagen. La imagen seleccionada aparecería en mi ImageView.
android
android-image
android-gallery
Praveen
fuente
fuente
Respuestas:
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 hacerlofile://
. Una mejor solución es simplemente usarcontext.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:
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.fuente
Intento de inicio
Resultado del proceso
Alternativamente, también puede reducir la resolución de su imagen para evitar errores de OutOfMemory.
fuente
int scale = 1; for ( ; bfOptions.outWidth / scale > TARGET_SIZE && bfOptions.outWidth > TARGET_SIZE; scale*=2);
Tienes que comenzar la intención de la galería para obtener un resultado.
Luego
onActivityForResult
, llameintent.getData()
para obtener el Uri de la imagen. Entonces necesita obtener la imagen del ContentProvider.fuente
Aquí hay un código probado para imagen y video. Funcionará para todas las API menores de 19 y mayores de 19 también.
Imagen:
Vídeo:
.
fuente
Haga esto para iniciar la galería y permitir que el usuario elija una imagen:
Luego, en su
onActivityResult()
uso, el URI de la imagen que se devuelve para establecer la imagen en su ImageView.fuente
fuente
fuente
Por algunas razones, todas las respuestas en este hilo, en el
onActivityResult()
intento de postprocesar lo recibidoUri
, como obtener la ruta real de la imagen y luego usarlaBitmapFactory.decodeFile(path)
para obtenerlaBitmap
.Este paso es innecesario. La
ImageView
clase tiene un método llamadosetImageURI(uri)
. Pase su uri y ya debería haber terminado.Para ver un ejemplo de trabajo completo, puede consultar aquí: http://androidbitmaps.blogspot.com/2015/04/loading-images-in-android-part-iii-pick.html
PD:
Obtener el
Bitmap
en una variable separada tendría sentido en los casos en que la imagen a cargar es demasiado grande para caber en la memoria, y una operación de reducción de escala es necesaria para evitarOurOfMemoryError
, como se muestra en la respuesta @siamii.fuente
llame al método chooseImage like-
fuente
fuente