jueves, 5 de junio de 2014

Mostrar la cámara en la aplicación android, Surfaceview

Buenos días a todos! Hoy os traigo un tutorial muy sencillo y muy práctico. Es para que podáis mostrar la preview de la cámara android en vuestra aplicación.
El código que he escrito es muy sencillo para que todos lo podáis entender bien, no obstante podría ser mucho más extendido como por ejemplo poner autofocus o modificar el tamaño del SrufaceView según el hardware de la cámara.
Para empezar solo decir que el SurfaceView se comporta igual que un layout solo que es bastante más complejo. Empecemos:
Como siempre os traigo el código totalmente comentado para que sea mucho más simple.


Primero creamos el layout que consta del SurfaceView y de un botón que ará la función de encender o apagar la cámara:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >
    <SurfaceView
        android:id="@+id/view_camera"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true" />

    <Button
        android:id="@+id/boton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:text="start" />
</RelativeLayout>
Ahora veremos el java, para entenderlo totalmente ará falta ver más de un tutorial de los que publiqué anteriormente.
package com.tywors.camara;

import java.io.IOException;

import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle; 
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
 
public class MainActivity extends Activity {
  //Boton en encender/apagar
  private Button boton;
  //Layout donde se verá la imagen de la camara
  private SurfaceView surfaceView;
  //Es el modulo que comunica la camara con el layout
  private SurfaceHolder surfaceHolder;
  //Camara librería de Hardware
  private Camera camara;
  //Simplemente para controlar si esta on/off
  private boolean encendida;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
        //relacionamos con el xml
        boton = (Button)findViewById(R.id.boton);
 surfaceView = (SurfaceView) findViewById(R.id.view_camera);
 //Le indicamos cual será el destino (surfaceview)
 surfaceHolder = surfaceView.getHolder();
 //la pp se iniciara en off
 encendida = false;
  
 //al presionar el boton
 boton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
      try {
  //Lamamos a la funcion de la camara que hemos creado
  startCamara();
  } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
      }
 }); 
 }
 private void startCamara() throws IOException{
  //Si la camara esta apagada
  if(!encendida){
   //pillamos el control del hardware de la camara
   camara = Camera.open();
   //Enlazamos el hardware con el surfaceHolder
   camara.setPreviewDisplay(surfaceHolder);
   //Encendemos todo
   camara.startPreview();
   encendida = true;
  }else{
   //paramos la camara
   camara.stopPreview();
   //liberamos el hardware
   camara.release();
   //Sabemos que ya esta en off
   encendida = false;
  }
 }

}

sobre todo no hay que olvidarse de poner el permiso para uilizar la cámara del teléfono, añadiremos esta línea en el manifes.xml encima del tag aplicacion:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />

Espero que os sirva de ayuda y también añado el projecto para eclipse por si queréis descargarlo:


Muchas grácias a todos!!!
Espero vuestros comentarios!!!

5 comentarios:

  1. Respuestas
    1. En esta línea:

      camara = Camera.open();

      añade algo así:

      camara = Camera.open(Camera.FRONT); (no estoy seguro pero lo que te diga eclipse)

      Eliminar
  2. ¿Cómo puedo ver lo que enfoca la cámara en otro dispositivo Android? Conectados por WiFi Direct.

    ResponderEliminar
  3. veo la camara horizontal como puedo cambiarla a vertical

    ResponderEliminar