2013-05-27 17 views
31

Ho un metodo chiamato switchCamera, sto provando a cambiare la fotocamera dalla parte anteriore a quella posteriore con un clic di un pulsante, in una transizione fluida. La mia applicazione si blocca quando chiamo questo metodo - so che non sto facendo qualcosa di giusto. Qualcuno può aiutarmi qui?Android: cambia fotocamera quando si fa clic sul pulsante

Qualsiasi aiuto è molto apprezzato.

public void switchCamera(){ 
    int camNum = 0; 
    camNum = Camera.getNumberOfCameras(); 
    int camBackId = Camera.CameraInfo.CAMERA_FACING_BACK; 
    int camFrontId = Camera.CameraInfo.CAMERA_FACING_FRONT; 

    Camera.CameraInfo currentCamInfo = new Camera.CameraInfo(); 

    //if camera is running 
    if (camera != null){ 
     //and there is more than one camera 
     if (camNum > 1){ 
      //stop current camera 
      camera.stopPreview(); 
      camera.setPreviewCallback(null); 
      //camera.takePicture(null, null, PictureCallback); 
      camera.release(); 
      camera = null; 
      //stop surfaceHolder? 

      if (currentCamInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){ 
       //switch camera to back camera 
       camera=Camera.open(camBackId); 
      } 
      else{ 
       //switch camera to front camera 
       camera=Camera.open(camFrontId); 
      } 
      //switch camera back on 
      //specify surface? 
      try { 
       camera.setPreviewDisplay(surfaceHolder); 
       camera.setPreviewCallback((PreviewCallback) this); 
       camera.startPreview(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
+1

Questo può aiutare: http: // StackOverflow. it/questions/6599454/switch-back-front-camera-on-fly – Ben

+1

Puoi incollare alcuni log in logcat prima che si blocchi? – StarPinkER

risposta

59
Button otherCamera = (Button) findViewById(R.id.OtherCamera); 

otherCamera.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View v) { 
if (inPreview) { 
    camera.stopPreview(); 
} 
//NB: if you don't release the current camera before switching, you app will crash 
camera.release(); 

//swap the id of the camera to be used 
if(currentCameraId == Camera.CameraInfo.CAMERA_FACING_BACK){ 
    currentCameraId = Camera.CameraInfo.CAMERA_FACING_FRONT; 
} 
else { 
    currentCameraId = Camera.CameraInfo.CAMERA_FACING_BACK; 
} 
camera = Camera.open(currentCameraId); 

setCameraDisplayOrientation(CameraActivity.this, currentCameraId, camera); 
try { 

    camera.setPreviewDisplay(previewHolder); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
camera.startPreview(); 
} 

Se si vuole rendere lo spettacolo della telecamera lo stesso orientamento il display, è possibile utilizzare il seguente codice.

public static void setCameraDisplayOrientation(Activity activity, 
     int cameraId, android.hardware.Camera camera) { 
    android.hardware.Camera.CameraInfo info = 
      new android.hardware.Camera.CameraInfo(); 
    android.hardware.Camera.getCameraInfo(cameraId, info); 
    int rotation = activity.getWindowManager().getDefaultDisplay() 
      .getRotation(); 
    int degrees = 0; 
    switch (rotation) { 
     case Surface.ROTATION_0: degrees = 0; break; 
     case Surface.ROTATION_90: degrees = 90; break; 
     case Surface.ROTATION_180: degrees = 180; break; 
     case Surface.ROTATION_270: degrees = 270; break; 
    } 

    int result; 
    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
     result = (info.orientation + degrees) % 360; 
     result = (360 - result) % 360; // compensate the mirror 
    } else { // back-facing 
     result = (info.orientation - degrees + 360) % 360; 
    } 
    camera.setDisplayOrientation(result); 
} 
+0

risposta utile ma una domanda ... Camera.CameraInfo.CAMERA_FACING_BACK/FRONT richiede il livello API 9. Cosa facciamo nelle versioni precedenti? – Anonymous

+0

Ancora la mia immagine della fotocamera non viene ruotata correttamente in modalità verticale. In modalità orizzontale sta funzionando bene. – AjayR

+0

Brillante - mi hai appena risparmiato un sacco di tempo con quel metodo setCameraDisplayOrientation! – Ewald

-6

Provare a utilizzare un AsyncTask. Il codice verrà eseguito in un thread separato senza disturbare il thread dell'interfaccia utente. Ci sono diversi esempi su come usare un AsyncTask su questo sito.

+3

Siamo spiacenti, ma questo non ha nulla a che fare con il thread dell'interfaccia utente. – shkschneider

3

Prima di tutto bisogna distruggere il SurfacePreview della fotocamera precedente, quindi hanno bisogno di creare un nuovo oggetto di telecamera (fronte/retro)

`//Code to destroy SurfacePreview 
mPreview.surfaceDestroyed(mPreview.getHolder()); 
mPreview.getHolder().removeCallback(mPreview); 
mPreview.destroyDrawingCache(); 
preview.removeView(mPreview); 
mCamera.stopPreview(); 
mCamera.stopPreview(); 
mCamera.setPreviewCallback(null); 
mCamera.release(); 

//Now create new camera object 
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) { 
    mCamera = Camera.open(camIdx); 
    mPreview = new CameraPreview(CameraActivity.this, mCamera); 
    preview.addView(mPreview); 
    mCamera.setPreviewDisplay(mPreview.getHolder()); 
    mCamera.startPreview(); 
}` 
Problemi correlati