2013-05-27 36 views
31

Tôi có một phương pháp gọi là switchCamera, tôi đang cố gắng chuyển camera từ trước ra sau chỉ bằng một lần bấm nút, trong một lần chuyển tiếp suôn sẻ. Ứng dụng của tôi bị đóng băng khi tôi gọi phương thức này - tôi biết tôi không làm điều gì đúng. Có ai có thể giúp tôi ngoài này không?Android: Chuyển máy ảnh khi nút bấm

Bất kỳ giúp đỡ được nhiều đánh giá cao.

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

này có thể giúp: http: // stackoverflow. com/questions/6599454/switch-back-front-camera-on-fly – Ben

+1

Bạn có thể dán một số bản ghi vào logcat trước khi nó bị đóng băng không? – StarPinkER

Trả lời

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

Nếu bạn muốn làm cho hiển thị hình ảnh camera trong định hướng giống như màn hình, bạn có thể sử dụng đoạn mã sau.

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

câu trả lời hữu ích nhưng một câu hỏi ... Camera.CameraInfo.CAMERA_FACING_BACK/FRONT yêu cầu cấp API 9. chúng tôi làm gì trong các phiên bản cũ hơn? – Anonymous

+0

Ảnh tĩnh của tôi không được xoay đúng cách ở chế độ dọc. Ở chế độ Phong cảnh, nó hoạt động tốt. – AjayR

+0

Rực rỡ - bạn vừa mới tiết kiệm cho tôi rất nhiều thời gian với phương thức setCameraDisplayOrientation tiện lợi đó! – Ewald

-6

Thử sử dụng AsyncTask. Mã sẽ chạy trong một chuỗi riêng biệt mà không làm phiền chuỗi giao diện người dùng của bạn. Có một số ví dụ về cách sử dụng AsyncTask trên trang web này.

+3

Xin lỗi, nhưng điều này không liên quan gì đến chuỗi giao diện người dùng. – shkschneider

3

Trước tiên, bạn cần phải tiêu diệt các SurfacePreview của camera trước, sau đó cần phải tạo ra một đối tượng mới của máy ảnh (Back/Front)

`//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(); 
}` 
Các vấn đề liên quan