jueves, 17 de noviembre de 2011

Lanzar la camara del móvil con nuestra aplicación Android

Hola a todos!!!!

Hoy os voy a mostrar un pequeño tutorial de cómo lanzar la cámara de nuestro móvil, a través de nuestra aplicación y recoger la foto que hemos hecho.

Primero tenemos que crear un objeto Intent para que lance la cámara de fotos, esto se hace con la siguiente línea de código: 

Intent camaraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

Una vez creado este objeto Intent, debemos empezar una nueva actividad. Pero cómo os comentaba al principio no sólo queremos lanzar la cámara de fotos sino que queremos recoger la foto que hemos hecho. Para ello tenemos que lanzar la nueva actividad esperando que nos devuelva un dato, para ello, hacemos lo siguiente:

startActivityForResult(camaraIntent, TOMAR_FOTO);  

La variable TOMAR_FOTO será una constante que identifique la actividad de la camara de fotos.

private static final int TOMAR_FOTO = 1;  

Todo este código (excepto la constante que cómo sabrás debe ir al principio del programa) podemos meterlo, por ejemplo, en el OnClick de un botón. Así cada vez que pinchemos sobre ese botón abrirá la interfaz de la cámara de fotos para hacer la foto.

Cómo última cosa que hacer queda recoger el resultado de la cámara de fotos, que en este caso será una foto. Para ello tenemos que sobrescribir la clase onActivityResult. Se puede hacer de la siguiente manera:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
                if  (requestCode == TOMAR_FOTO) {
                         Bitmap imagen = (Bitmap) data.getExtras().get("data"); 
               }
 }


Como veis el resultado que devuelve la cámara es un objeto de tipo Bitmap. Bitmap es una clase de Android que sirve para manejar las imágenes. Por ejemplo, si queremos que se muestre en la interfaz de nuestra aplicación la foto que acabamos de hacer, sólo tendremos que hacer esto: 

ImageView iv_foto = (ImageView) findViewById(R.id.fotoView);
iv_foto.setImageBitmap(imagen);  


Y esto es todo, si tenéis alguna duda podéis escribir todos los comentarios que queráis.

Un saludo!!!


11 comentarios:

  1. si en dado caso si la variable "imagen" la quiero guarda y enviar como un adjunto a un email, como podria hacerlo?

    intento hacer esto:
    j.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + bt));

    donde "bt" es la variable "imagen" en tu codigo

    y la almaceno de la siguiente forma:

    Bitmap bt = BitmapFactory.decodeFile(picturePath);
    ImageView img = (ImageView)findViewById(R.id.imageView1);
    img.setImageBitmap(bt);

    ResponderEliminar
  2. en R.id.fotoView me sale un error debo implementar un layout? o que, estoy iniciandome en esto te lo agradeceria

    ResponderEliminar
    Respuestas
    1. Hola Taty.

      Tienes que implementar un layout solamente si quieres mostrar la imagen que se cargue en pantalla, sino no es necesario. Si no la quieres mostrar esas dos líneas de código no te sirven para nada.

      Si la quieres mostrar, tendrás que tener en un layout un ImageView, de esta forma:



      Un saludo.

      Eliminar
  3. ImageView iv_foto = (ImageView) findViewById(R.id.fotoView);
    iv_foto.setImageBitmap(imagen);

    Esta parte donde vaa, estoy iniciando gracias por la ayuda... :D

    ResponderEliminar
    Respuestas
    1. Hola!

      Cómo le dije a Taty en el anterior comentario esta parte del código sólo sirve si quieres mostrar la imagen obtenida de la cámara en la interfaz.

      Si la quieres mostrar justo después de que la cámara realice la foto, entonces pon estas dos instrucciones debajo de este código:

      Bitmap imagen = (Bitmap) data.getExtras().get("data");

      Si te sigue sin quedar claro, me dices!
      Un saludo

      Eliminar
  4. Como guardas la imagen en la memoria externa? (SD)

    ResponderEliminar
  5. Nos podrías pasar el código completo para los novatos nos ayudaría a entender muchas cosas y muchas gracias por tu aporte!!

    ResponderEliminar
  6. Gracias logre que funcionara siguiendo tus paso, lo que noto es que la foto se ve muy regular en la activity, como podríamos mejorar esta parte!!
    acá dejo la clase completa.
    package usocamara.Package;

    import android.app.Activity;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ImageView;

    public class UsoCamara extends Activity {

    private static final int TOMAR_FOTO = 1;

    private OnClickListener OkListener= new OnClickListener(){

    @Override
    public void onClick(View arg0) {
    // TODO Auto-generated method stub
    //lanzar la camara
    Intent camaraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(camaraIntent, TOMAR_FOTO);
    }

    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Button foto= (Button)findViewById(R.id.btnfoto);
    foto.setOnClickListener(OkListener);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == TOMAR_FOTO) {
    Bitmap imagen = (Bitmap) data.getExtras().get("data");
    ImageView iv_foto = (ImageView) findViewById(R.id.fotoView);
    iv_foto.setImageBitmap(imagen);
    }
    }

    }
    .....

    ResponderEliminar
  7. como hago para enviar la imagen capturada por correo electronico?

    ResponderEliminar
  8. hola a todos, como hago que al ejecutar la camara tome automaticamente la foto y la guarde? copie codigo de toda la web para invocar la camara y que saque la foto y guarde de forma manual

    ResponderEliminar
  9. Hola! donde podria guardar una serie de imagenes que quiera tomar con la camara, en que tipo de archivo?

    ResponderEliminar