En Android, se puede implementar en una aplicación la posibilidad de que el usuario pueda seleccionar una imagen de la galería del móvil para ser usada en la aplicación. Esto se puede realizar mediante un Intent ya definido en el sistema operativo Android, por lo que su implementación es sencilla.
Básicamente habrá que hacer la llamada al Intent para luego recuperar la respuesta del mismo, guardando la imagen seleccionada en un ImageView del layout. Para ello, lo primero será definir en una constante el código del Intent para luego ser capaces de obtener la imagen que devolverá.
private static final int SELECT_FILE = 1;
El siguiente método llamado abrirGaleria, se encarga de abrir la actividad en la cual se mostrará la galería para seleccionar la imagen. Simplemente, abre el intent predefinido ACTION_GET_CONTENT, filtrando por el tipo imagen con cualquier extensión y abre la actividad con el identificador de la constante SELECT_FILE que se ha definido antes, para abrir galería Android con la aplicación predefinida por el sistema para ello.
public void abrirGaleria(View v){ Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult( Intent.createChooser(intent, "Seleccione una imagen"), SELECT_FILE); }
El otro método implicado, es onActivityResult. Como este método puede utilizarse también para recuperar los parámetros de salida de cualquier actividad llamada desde aquí, habrá que procesar sólo las que provengan del identificador SELECT_FILE. En este caso, cargará el fichero en un Bitmap para, a continuación, mostrarlo en un ImageView, en este caso llamado ivImagen, el cual deberá existir en el layout asociado a la actividad.
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { super.onActivityResult(requestCode, resultCode, imageReturnedIntent); Uri selectedImageUri = null; Uri selectedImage; String filePath = null; switch (requestCode) { case SELECT_FILE: if (resultCode == Activity.RESULT_OK) { selectedImage = imageReturnedIntent.getData(); String selectedPath=selectedImage.getPath(); if (requestCode == SELECT_FILE) { if (selectedPath != null) { InputStream imageStream = null; try { imageStream = getContentResolver().openInputStream( selectedImage); } catch (FileNotFoundException e) { e.printStackTrace(); } // Transformamos la URI de la imagen a inputStream y este a un Bitmap Bitmap bmp = BitmapFactory.decodeStream(imageStream); // Ponemos nuestro bitmap en un ImageView que tengamos en la vista ImageView mImg = (ImageView) findViewById(R.id.ivImagen); mImg.setImageBitmap(bmp); } } } break; } }
Excelente aporte.
Tuve un inconveniente al realizar esta operación porque me lanzaba un error y buscando y buscando pude resolverlo agregando un permiso que es necesario para realizar esto.
en el Manifest
Gracias Ignacio. Si me dices qué permiso has necesitado lo agrego a la entrada para dejarla más completa.
Saludos!
manifest
Tengo duda de donde sale SELECTED_FILE1 y selectedPath1
De donde sale el selectedPath1?
Hola Carlos y Dyne!
Gracias por el comentario.
He modificado el código para corregir lo que indicábais.
Espero que ya no se me haya olvidado nada 🙂
Saludos!
hola,
he conseguido seleccionar la imagen, y después he guardado la ruta (urinales) como string en un sharedprefences para poder usarla. es decir, que al volver a abrir la aplicación, asignar a un imageView esta imagen.
en el oncreate, obtengo la ruta con el sharedpreferences, la paso a uri y la cargo en el imageView con setImageUri.
pero me da error de permisos.(manage_documents) que ya se lo he añadido al manifest, pero no funciona.
he probado ha seleccionar la imagen, guardarla en el sharedpreferences
y cargarla en el imageView, y asi si funciona.
gracias
Buenas, tras implementar el código, la cosa funciona, pero tengo un problema cuando las imágenes que selecciono son demasiado pesadas, alguna forma de solucionarlo?
Muchas gracias.