Usando la Cámara en Android

Luego de mucho investigar he dado con el code para sacar, seleccionar y mostrar fotos en nuestra aplicación en Android. No usar la cámara propiamente dicha sino que lanza la aplicación Camera de nuestro dispositivo. Si nuestros objetivos son simples siempre es conveniente usar lo que ya esta hecho y obtener los datos obtenidos. Otros ejemplos son para ver videos en YouTube o escribir y mandar mails.

Este ejemplo cuenta con tres botones (sacar foto, seleccionar una del carrete y uno para mostrar) y un imageview que será el contenedor de la imagen seleccionada.

 

Antes que nada tenemos que definir dos variables globales:

  private static final int REQUEST_CAMERA = 1;
  private static final int REQUEST_SELECT_PHOTO = 0;

Lo primero que tenemos que hacer es levantar los componentes para luego usarlos:

        btn_camera=(Button)findViewById(R.id.button1);
        btn_seleccionar=(Button)findViewById(R.id.button2);
        btn_mostrar=(Button)findViewById(R.id.button3);
 

Ahora vamos a definir el comportamiento de los tres botones:

 

1) Botón de Cámara

 
String state = Environment.getExternalStorageState();
                if (Environment.MEDIA_MOUNTED.equals(state)) 
                {                    
                    long captureTime = System.currentTimeMillis();                    
                    photoPath = Environment.getExternalStorageDirectory() 
                     + "/DCIM/Camera/Point" + captureTime + ".jpg";
                    try
                    {
                        Intent intent = 
                        new Intent("android.media.action.IMAGE_CAPTURE");
                        File photo = new File(photoPath);
                        intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(photo));                        
                        startActivityForResult
                        (Intent.createChooser(intent, "Capture Image"), REQUEST_CAMERA);
                    } 
                    catch (Exception e) 
                    {
                    }
                }
 
 

Lo que hacemos acá es lanzar el intento de la aplicación de la cámara. Lo ejecutamos como

ActivityForResult porque esperamos un resultado que será la imagen obtenida. El segundo parámetro

es la variable que definimos anteriormente para luego capturarla cuando vuelve a nuestra app y saber

de donde estamos volviendo ( porque podemos volver de muchos lados 🙂 )

 

2) Botón seleccionar:

  btn_seleccionar.setOnClickListener(new OnClickListener()
        {
		@Override
		public void onClick(View v)
		{
			Intent ii = new Intent(Intent.ACTION_PICK) ;
			ii.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
			MediaStore.Images.Media.CONTENT_TYPE) ;
			startActivityForResult(ii,REQUEST_SELECT_PHOTO) ;
		}
		});
 

Acá hacemos algo parecido que el botón anterior pero lanzamos el intento del pick de la imagen.

Yo tengo la filosofía de que si algo esta hecho, funciona y se puede reutilizar para nuestro

beneficio hay que usarlo. No hay que perder el tiempo reinventando la rueda sino dándole nuevos y

mejores usos. Ademas hay que aprovechar todo lo hecho y todas sus funcionalidades ya implementadas.

Volviendo al code, vemos que el segundo parámetro del intento es la segunda variable que definimos

de manera global.

3) Botón mostrar

     btn_mostrar.setOnClickListener(new OnClickListener()
        {
		@Override
		public void onClick(View v)
		{
			if (path!=null)
			{
				File imgFile = new  File(path);
				if(imgFile.exists());
				{
					Bitmap myBitmap = 
                                              BitmapFactory.decodeFile(imgFile.getAbsolutePath());
					ImageView myImage = (ImageView) findViewById(R.id.imageView1);
					myImage.setImageBitmap(myBitmap);
				}
			}
		}
        });

Lo que hacemos aquí es recuperar el path obtenido tanto de haber sacado una foto o haber seleccionado una y creamos una imagen a partir de la ruta. Luego simplemente la mostramos en el imageview.

Ambos intentos (lanzar la cámara o el picker de fotos) fueron lanzados esperando un resultado. Al completar nuestra actividad en ellos (sacar una foto o seleccionar una) volvemos a nuestra app y debemos manejar los datos recibidos. Veamos el código para luego explicarlo.

 

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
        super.onActivityResult(requestCode, resultCode, data);
        
        switch (requestCode)
        {
        case REQUEST_CAMERA:        
                                if (!photoPath.equals("")&&(photoPath!=null))
                                {
                                    
                                    //oPunto.setPath(photoPath);
                                    //TODO mensaje de foto seleccionada
                                }
                                                  
                            
                            break ;
        case REQUEST_SELECT_PHOTO:
            
                            if( resultCode != 0 )
                            {
                            
                                  Cursor c = managedQuery(data.getData(),null,null,null,null) ;
                                  if( c.moveToFirst() )
                                  {
                            
                                      photoPath = c.getString(1) ;
                                    
                                      //oPunto.setPath(photoPath);
                                        //TODO mensaje de foto seleccionada
                                  }
                             }
        default: break;
                             
        }
                                     
    }
 

Para saber de donde venimos hay que mirar las estrellas el requestCode. Según el resultado ejecutamos cierta lógica en nuestro codigo.

a) Si volvemos de la cámara lo que hacemos primero es convertir la imagen en un archivo para luego obtener su path y almacenarlo en la variable global path para que luego el botón “mostrar” pueda utilizarla.

b) Si volvemos del picker de fotos, creamos un cursor con toda la data obtenida. A pesar de ser solo una imagen, esta contiene muchos datos, agrupados en columnas. La segunda columna (la primera es la 0), contiene el path de nuestra imagen seleccionada. Lo guardamos en nuestra variable y listo.

Listo! Ya sabemos usar la cámara, seleccionar y mostrar cualquier foto. Algunas aclaraciones sobre el ejemplo. Aun no se porque, la cámara siempre se ejecuta en modo apaisado. He intentado muchos ejemplos que hay dando vuelta pero no logre hacerlo funcionar de la manera adecuada. Una ventaja de este code es que se guardan las imágenes en la sdcard y no en el directorio de nuestra aplicación.

 

Aqui les dejo un método que se usar cuando volvemos de la cámara.

 

public static File convertImageUriToFile (Uri imageUri, Activity activity)
	{
		Cursor cursor = null;
		try
		{
		    String [] proj={MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID, MediaStore.Images.ImageColumns.ORIENTATION};
		    cursor = activity.managedQuery( imageUri,
		            proj, // Which columns to return
		            null,       // WHERE clause; which rows to return (all rows)
		            null,       // WHERE clause selection arguments (none)
		            null); // Order-by clause (ascending by name)
		    int file_ColumnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
		    int orientation_ColumnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.ORIENTATION);
		    if (cursor.moveToFirst())
		    {
		        String orientation =  cursor.getString(orientation_ColumnIndex);
		        Log.d("PingDroid", "OR "+orientation);
		        return new File(cursor.getString(file_ColumnIndex));
		    }
		    return null;
		}
		catch (Exception ex)
		{
			return null;
		}
		finally
		{
		    if (cursor != null)
		    {
		        cursor.close();
		    }
		}
	}

No se los puedo explicar porque no es de mi autoría pero les digo que todo funciona de maravilla.

También les dejo el código para leerlo sin mis molestas aclaraciones.

 

http://www.mycodestock.com/code/3207/

 

Cualquier duda o comentario al respecto los invito a dejar su opinión en esta entrada.

Gracias por leer, no se olviden de comentar y hasta la post que viene, amigos.

2 thoughts on “Usando la Cámara en Android

  1. Buenísimo el tutorial pero no me guarda la foto… la saco, acepto, uso el segundo botón (seleccionar) y no aparece guardada la imagen… puedo seleccionar cualquier otra imagen que esté previamente almacenada y la muestra bien, pero no la foto que tomo con la aplicación… alguna idea de por qué sucede eso?

Responder a Anitsuga Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *