2012-05-07 23 views
10

Estoy tratando de crear una vista de superficie para una cámara para que se vea en la superficie siempre que esté en la vista de la cámara. Por el momento, todo lo que puedo ver en la vista de mi cámara es una vista en pantalla negra. He intentado buscar en Google y aquí, pero hasta ahora no he encontrado lo que estoy buscando. Cualquiera me puede sugerir alguna idea.Vista de superficie de la cámara Android

Respuesta

18

He escrito una clase esto puede ayudarte

public class Preview_can_work extends Activity { 
     private SurfaceView surface_view; 
     private Camera mCamera; 
     SurfaceHolder.Callback sh_ob = null; 
     SurfaceHolder surface_holder  = null; 
     SurfaceHolder.Callback sh_callback = null; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      getWindow().setFormat(PixelFormat.TRANSLUCENT); 

      surface_view = new SurfaceView(getApplicationContext()); 
      addContentView(surface_view, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 

      if (surface_holder == null) { 
       surface_holder = surface_view.getHolder(); 
      } 

      sh_callback = my_callback(); 
      surface_holder.addCallback(sh_callback); 
     } 

      SurfaceHolder.Callback my_callback() {  
       SurfaceHolder.Callback ob1 = new SurfaceHolder.Callback() { 

        @Override 
        public void surfaceDestroyed(SurfaceHolder holder) { 
          mCamera.stopPreview(); 
          mCamera.release(); 
          mCamera = null; 
        } 

        @Override 
        public void surfaceCreated(SurfaceHolder holder) { 
         mCamera = Camera.open(); 

          try { 
           mCamera.setPreviewDisplay(holder); 
          } catch (IOException exception) { 
           mCamera.release(); 
           mCamera = null; 
          } 
        } 

        @Override 
        public void surfaceChanged(SurfaceHolder holder, int format, int width, 
          int height) { 
         mCamera.startPreview(); 
        } 
       }; 
       return ob1; 
     } 
    } 

en su copia del archivo de manifiesto el código de autorización cámara

<uses-permission android:name="android.permission.CAMERA"/> 

Explicación:

SurfaceView es un tipo de vista que contiene una SurfaceHolder. SurfaceHolder contiene la superficie sobre la cual podemos mostrar nuestros medios (generalmente marcos).

mCamera es un objeto de cámara que contendrá la instancia de la cámara.

Cuando desee mantener la instancia predeterminada de la cámara, simplemente puede llamar a Camera.open();

Cámara mCámara = Camera.open();

Ahora tiene la cámara abierta o está teniendo una instancia predeterminada de la cámara. Ahora necesita capturar fotogramas de la cámara y mostrarlos en una superficie. Pero no puede mostrarlo sin

superficie. Aquí SurfaceView proporciona SurfaceHolder y SurfaceHolder proporciona una superficie para mostrar los marcos de la cámara. Ahora cuando se creará la superficie, tres funciones de devolución de llamada serán

llamadas.

1. public void surfaceCreated(SurfaceHolder holder) 
2. public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
3. public void surfaceDestroyed(SurfaceHolder holder) 

Nota: - La superficie se destruirá cuando la aplicación entre en pausa.

surfaceCreated: surfaceCreated es una función de devolución de llamada que se ejecutará cuando se cree su superficie. En esto, puede abrir su cámara y establecer otros atributos.

surfaceChanged: Esto se llamará al menos una vez cuando se creará su superficie. Después de eso se llamará cada vez que cambie su superficie (en la rotación del dispositivo). Aquí puede

iniciar su vista previa porque su superficie ya ha creado.

surfaceDestroyed: Esto se ejecutará cada vez que su superficie se destruya.Ahora bien, si no tiene superficie, entonces puede exhibir los marcos de su cámara, así que he lanzado la cámara usando

mCamera.release(). Esto es muy importante porque si tu actividad estará en pausa y cualquier otra actividad intenta abrir la cámara, entonces no podrá abrirlo ya que tienes

ya abierta. La cámara es un recurso compartido, por lo que solo una aplicación puede usarla una vez. Así que recuerde una cosa cada vez que abra una cámara, luego siempre libérela.

stopPreview: Cuando inicia la vista previa, la cámara comienza a capturar los fotogramas y mostrarlos en una superficie. Ahora, si su superficie se ha destruido, debe dejar de capturar los marcos

desde la cámara, por lo que debe llamar a mCamera.stopPreview.

+0

Gracias Bharat, ¡Definitivamente voy a dar esto! gracias de nuevo. ¿Alguien ha conocido un buen artículo en el que pueda leer sobre "La cámara no funciona cuando se ejecuta en emulador"? ¿Es verdad todavía? – Kitaro

+0

De hecho, mientras creas el emulador necesitas agregar una cámara, entonces creo que funcionará. Trataré de avisarte ... –

+0

Bien, ¿entonces no necesitamos tener un dispositivo para usar la cámara para ver en vivo? Cos parte del artículo que leí diciendo que no podemos ejecutar la cámara en el emulador, pero no estoy seguro de si esto se ha resuelto. Por favor hagamelo saber. Gracias. – Kitaro

0

Hacer Shure ha añadido el permiso:

<uses-permission android:name="android.permission.CAMERA"/>

también estas propiedades de la ventana:

getWindow().setFormat(PixelFormat.TRANSLUCENT); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

publicar algunos de código si eso no funciona con el fin de ayudarle

+0

Gracias, ya he agregado el permiso como sugirió; y estaba pensando en usar 'surfaceChanged'? Por el momento, todo lo que puedo ver en la superficie de mi cámara es negro ... No entiendo por qué. – Kitaro

Cuestiones relacionadas