Seleccionando imagenes en Android (estilo Facebook)

Buenas, esta semana vamos a ver como seleccionar imagenes para nuestra aplicación. El proceso es el mismo que podemos ver en aplicaciones tan conocidas como Facebook, Twitter, etc... presentes en nuestros teléfonos móviles, y porque no, también en vuestras aplicaciones a partir de ahora si queréis.



Empiezo explicandoos un poco el proceso, este es muy simple, y tiene que ver un poco con lo que vimos la semana pasada, reconocer voz en Android. Tenemos un botón el cual abre una ventana de dialogo y nos pregunta si queremos hacer una foto o elegirla de la galeria. En función de lo que elegimos, lanzaremos un Intent (acción) del sistema de Android u otra. Una llamará al programa que gestiona la galería y otro al que gestiona la cámara.


Una vez hecha la foto o seleccionada, se devolverá un resultado, el cual capturamos en onActivityResult y nos devolverá en uno de sus parámetros la dirección URI de la foto, la cual trataremos como mejor nos convenga. Vamos entonces a ver como hacerlo.


Abrimos el activity principal de nuestro proyecto, insertais los siguientes objetos en el layout y los inicializais antes de nada, un Button, ImageView y TextView a los cuales yo llamaré btnPhoto, imgPhoto y lblPhoto. No os pongo el código para esto ya que hemos visto como hacer esto en artículos anteriores. Seteamos el click de nuestro botón para que lance la ventana de diálogo para seleccionar entre hacer una foto o seleccionarla.


btnPhoto.setOnClickListener(new OnClickListener() {   
 public void onClick(View v) {
  dialogPhoto();
 }
}); 


Y aquí está el código que abre la ventana de diálogo:



private int SELECT_IMAGE = 237487;
private int TAKE_PICTURE = 829038;

private void dialogPhoto(){
     try{
  final CharSequence[] items = {"Seleccionar de la galería", "Hacer una foto"};

  AlertDialog.Builder builder = new AlertDialog.Builder(this);
  builder.setTitle("Seleccionar una foto");
  builder.setItems(items, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int item) {
      switch(item){
       case 0:
     Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI);
     intent.setType("image/*");
     startActivityForResult(intent, SELECT_IMAGE);   
     break;
       case 1:
     startActivityForResult(new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE), TAKE_PICTURE);
     break;
      }
            
    }
  });
  AlertDialog alert = builder.create();
  alert.show(); 
     } catch(Exception e){}
    }



Lo primero que se hace es definir dos variables para poder identificar en el onActivityResult que intent se lanzó. Ya en el método, definimos en un array las dos opciones de la ventana. Contruimos la ventana de diálogo dandolo un título y añadiendo las opciones que mostraremos. También definimos el click para cada uno de los items, y con el switch decidimos que sucederá en cada caso.
En los dos casos llamamos a un Intent del sistema, y mediante el método startActivityForResult hacemos la llamada pasandole como segundo parámetro cada una de las variables que definimos al principio.
En el caso de la selección de foto, le indicamos el tipo para que solo seleccione imagenes, en caso contrario podría seleccionar cualquier archivo.


Vamos a ver que es lo que debemos hacer una vez que el usuario haya seleccionado una foto. Ahora debemos sobreescribir el método onActivityResult de nuestra activity. Os muestro como:


@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
          
      try{
 if (requestCode == SELECT_IMAGE)
    if (resultCode == Activity.RESULT_OK) {
      Uri selectedImage = data.getData();
      lblPhoto.setText(getPath(selectedImage));
             imgPhoto.setImageURI(selectedImage); 
            } 
        if(requestCode == TAKE_PICTURE)
    if(resultCode == Activity.RESULT_OK){
      Uri selectedImage = data.getData();
      lblPhoto.setText(getPath(selectedImage));  
             imgPhoto.setImageURI(selectedImage); 
            }
      } catch(Exception e){}
    }   



Como podeis ver el método es muy sencillo, verificamos que acción estamos recogiendo y si todo fue bien, en ese caso, obtenemos la imagen en una dirección URI. En el caso de la etiqueta parseamos la dirección con el método getPath que os mostraré ahora, y en el caso de la imagen, seteamos la imagen con el método setImageUri.
Os pongo ahora que haría el método getPath:


private String getPath(Uri uri) {
 String[] projection = { android.provider.MediaStore.Images.Media.DATA };
 Cursor cursor = managedQuery(uri, projection, null, null, null);
 int column_index = cursor.getColumnIndexOrThrow(android.provider.MediaStore.Images.Media.DATA);
 cursor.moveToFirst();
 return cursor.getString(column_index);
   }


Como veis, estamos parseando la dirección URI a una String, la cual devolvemos al final.


Y así acabamos de seleccionar imagenes. Como veis no es muy complicado implementarlo en vuestras aplicaciones y seguro que dará mucho juego en vuestros desarrollos. Hasta la semana que viene.
P.D: Feliz día de los santos inocentes.

Comments are closed.