2013-05-27 17 views
31

私はswitchCameraというメソッドを持っています。ボタンをクリックするだけでカメラを前後に切り替えることができます。このメソッドを呼び出すと、アプリケーションがフリーズする - 私は何か正しいことをしていないことを知っている。誰でもここで私を助けることができますか?Android:ボタンをクリックしたときにカメラを切り替える

ご迷惑をおかけして申し訳ありません。

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

これが役立つことがあります。http://のstackoverflowを。 com/questions/6599454/switch-back-front-camera-on-fly – Ben

+1

フリーズする前にいくつかのログをlogcatに貼り付けることはできますか? – StarPinkER

答えて

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(); 
} 

あなたは 表示と同じ向きでカメラ画像のショーを作りたい場合は、次のコードを使用することができます。

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

有用な答えですが、1つの質問... Camera.CameraInfo.CAMERA_FACING_BACK/FRONTにはAPIレベル9が必要です。古いバージョンではどうしますか? – Anonymous

+0

まだポートレートモードでカメラの画像が正しく回転していません。風景モードでは正常に動作しています。 – AjayR

+0

華麗な - あなたはちょうどその素晴らしいsetCameraDisplayOrientationメソッドで私に多くの時間を節約しました! – Ewald

-6

AsyncTaskを使用してください。コードは、あなたのUIスレッドを妨げることなく、別のスレッドで実行されます。このサイトでAsyncTaskを使用する方法のいくつかの例があります。

+3

申し訳ありませんが、これはUIスレッドとは関係ありません。 – shkschneider

3

あなたは、カメラの新しいオブジェクト(バック/フロント)を作成する必要があり、以前のカメラのSurfacePreviewを破壊する必要がまず

`//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(); 
}` 
関連する問題