2012-09-05 30 views
13

Aquí está mi código de ejemplo:cámara Tutorial para Android (usando SurfaceView)

package newslab.video.server; 

import android.app.Activity; 
import android.hardware.Camera; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

public class VideoServer extends Activity implements SurfaceHolder.Callback { 
    TextView testView; 

    Camera camera; 
    SurfaceView surfaceView; 
    SurfaceHolder surfaceHolder; 

    private final String tag = "VideoServer"; 

    Button start, stop; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     start = (Button)findViewById(R.id.btn_start); 
     start.setOnClickListener(new Button.OnClickListener() { 
      public void onClick(View arg0) { 
       start_camera(); 
      } 
     }); 

     stop = (Button)findViewById(R.id.btn_stop); 
     stop.setOnClickListener(new Button.OnClickListener() { 
      public void onClick(View arg0) { 
       stop_camera(); 
      } 
     }); 

     surfaceView = (SurfaceView)findViewById(R.id.surfaceView1); 
     surfaceHolder = surfaceView.getHolder(); 
     surfaceHolder.addCallback(this); 
     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    private void start_camera() { 
     try{ 
      camera = Camera.open(); 
     }catch(RuntimeException e){ 
      Log.e(tag, "init_camera: " + e); 
      return; 
     } 
     Camera.Parameters param; 
     param = camera.getParameters(); 
     //modify parameter 
     param.setPreviewFrameRate(20); 
     param.setPreviewSize(176, 144); 
     camera.setParameters(param); 
     try { 
      camera.setPreviewDisplay(surfaceHolder); 
      camera.startPreview(); 
     } catch (Exception e) { 
      Log.e(tag, "init_camera: " + e); 
      return; 
     } 
    } 

    private void stop_camera() { 
     camera.stopPreview(); 
     camera.release(); 
    } 

    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { 
     // TODO Auto-generated method stub 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
    } 
} 

Sin embargo, sólo se muestra la vista previa y detener la cámara.
¿Hay algún otro tutorial para enseñar el procesamiento posterior, como la forma de guardar la imagen o procesar la imagen con mapa de bits?

+0

no usar cámara nativa significa qué? qué cámara estás usando? –

+0

no es la intención – jjLin

+0

¿tiene la solución de su consulta básica? –

Respuesta

29

Ok. Así que aquí está la solución:

No estoy agregando ningún try catch. Esto es simplemente para capturar la imagen y almacenarla en la tarjeta SD.

public class VideoServer extends Activity implements SurfaceHolder.Callback { 
    TextView testView; 

    Camera camera; 
    SurfaceView surfaceView; 
    SurfaceHolder surfaceHolder; 
    PictureCallback rawCallback; 
    ShutterCallback shutterCallback; 
    PictureCallback jpegCallback; 
    private final String tag = "VideoServer"; 

    Button start, stop, capture; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     start = (Button)findViewById(R.id.btn_start); 
     start.setOnClickListener(new Button.OnClickListener() 
     { 
      public void onClick(View arg0) { 
       start_camera(); 
      } 
     }); 
     stop = (Button)findViewById(R.id.btn_stop); 
     capture = (Button) findViewById(R.id.capture); 
     stop.setOnClickListener(new Button.OnClickListener() 
     { 
      public void onClick(View arg0) { 
       stop_camera(); 
      } 
     }); 
     capture.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       captureImage(); 
      } 
     }); 

     surfaceView = (SurfaceView)findViewById(R.id.surfaceView1); 
     surfaceHolder = surfaceView.getHolder(); 
     surfaceHolder.addCallback(this); 
     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     rawCallback = new PictureCallback() { 
      public void onPictureTaken(byte[] data, Camera camera) { 
       Log.d("Log", "onPictureTaken - raw"); 
      } 
     }; 

     /** Handles data for jpeg picture */ 
     shutterCallback = new ShutterCallback() { 
      public void onShutter() { 
       Log.i("Log", "onShutter'd"); 
      } 
     }; 
     jpegCallback = new PictureCallback() { 
      public void onPictureTaken(byte[] data, Camera camera) { 
       FileOutputStream outStream = null; 
       try { 
        outStream = new FileOutputStream(String.format(
          "/sdcard/%d.jpg", System.currentTimeMillis())); 
        outStream.write(data); 
        outStream.close(); 
        Log.d("Log", "onPictureTaken - wrote bytes: " + data.length); 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } finally { 
       } 
       Log.d("Log", "onPictureTaken - jpeg"); 
      } 
     }; 
    } 

    private void captureImage() { 
     // TODO Auto-generated method stub 
     camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
    } 

    private void start_camera() 
    { 
     try{ 
      camera = Camera.open(); 
     }catch(RuntimeException e){ 
      Log.e(tag, "init_camera: " + e); 
      return; 
     } 
     Camera.Parameters param; 
     param = camera.getParameters(); 
     //modify parameter 
     param.setPreviewFrameRate(20); 
     param.setPreviewSize(176, 144); 
     camera.setParameters(param); 
     try { 
      camera.setPreviewDisplay(surfaceHolder); 
      camera.startPreview(); 
      //camera.takePicture(shutter, raw, jpeg) 
     } catch (Exception e) { 
      Log.e(tag, "init_camera: " + e); 
      return; 
     } 
    } 

    private void stop_camera() 
    { 
     camera.stopPreview(); 
     camera.release(); 
    } 

    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { 
     // TODO Auto-generated method stub 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
    } 

} 

No presione el botón caputure antes de la comenzar, porque no comprobado. Solo quería mostrarte cómo capturar y almacenar imágenes en la tarjeta SD .

+1

para obtener más información. Visite este sitio http://marakana.com/forums/android/examples/39.html –

+0

Su solución es perfecta. Pero una pregunta más, ¿cómo puedo obtener la imagen capturada como mapa de bits para hacer más efecto? – jjLin

+1

para eso tienes que tomar la imagen capturada de la tarjeta SD usando esto. Bitmap bitmap = BitmapFactory.decodeFile ("/ path/images/imageName.jpg"); Y puede hacer más operaciones en el mapa de bits –

12

No se olvide de tomar el permiso para el uso de la cámara en el archivo de manifiesto de Android,

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

También hay que tener permiso para almacenar las imágenes en la tarjeta SD,

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

que estaba teniendo problemas con cámara, descubriendo cómo implementar y trabajar con y encontró estos recursos: Camera preview. En la parte inferior de la página que tiene ejemplos de los escenarios más comunes, así como la de su pregunta original: Take and preview Photo

2

permiso cámara en manifiest archivo:

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

permiso para almacenar la imagen de sdcard en manifiest archivo:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
Cuestiones relacionadas