2016-06-28 31 views
1

Hello there我是Camera API的newbiew。我正在向我自己學習!我只是想切換我的相機後臺和前臺! 我的設備有前後相機! 我這樣做,如:使用Camera API在Android上切換攝像頭


public class CameraFrag extends Fragment { 

//Variables 
private Camera mCamera; 
private CameraPreview mPreview; 
private ToggleButton flipCamera; 
//////////////////////////////////// 

public CameraFrag() { 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    //inflate the layout 
    View v = inflater.inflate(R.layout.frag, container, false); 

    flipCamera = (ToggleButton) v.findViewById(R.id.flipper); 

    // Create an instance of Camera 
    mCamera = getCameraInstance(); 

    // Create our Preview view and set it as the content of our activity. 
    mPreview = new CameraPreview(getContext(), mCamera); 
    FrameLayout preview = (FrameLayout) v.findViewById(R.id.camera_preview); 
    preview.addView(mPreview); 

    flipCamera.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      // TODO Auto-generated method stub 
      try{ 
       mCamera.stopPreview(); 

       if(isChecked){ 
        mCamera=openFrontFacingCamera(); 
       } 
       else{ 
        mCamera=openBackFacingCamera(); 
       } 
       mCamera.startPreview(); 
      }catch(Exception exp){ 
       Log.i("#LOGTAG","EXCEPTION "+exp); 
      } 
     } 
    }); 

    return v; 
} 

private Camera openBackFacingCamera() { 
    int cameraCount = 0; 
    Camera cam = null; 
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); 
    cameraCount = Camera.getNumberOfCameras(); 
    for (int camIdx = 0; camIdx < cameraCount; camIdx++) { 
     Camera.getCameraInfo(camIdx, cameraInfo); 
     if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) { 
      cam = Camera.open(camIdx); 
     } 
    } 

    return cam; 
} 

private Camera openFrontFacingCamera() { 
    int cameraCount = 0; 
    Camera cam = null; 
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); 
    cameraCount = Camera.getNumberOfCameras(); 
    for (int camIdx = 0; camIdx < cameraCount; camIdx++) { 
     Camera.getCameraInfo(camIdx, cameraInfo); 
     if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
      cam = Camera.open(camIdx); 
     } 
    } 

    return cam; 
} 

/** A safe way to get an instance of the Camera object. */ 
public static Camera getCameraInstance(){ 
    Camera c = null; 
    try { 
     c = Camera.open(); // attempt to get a Camera instance 
    } 
    catch (Exception e){ 
     // Camera is not available (in use or does not exist) 
    } 
    return c; // returns null if camera is unavailable 
} 

}


的問題是,它總是拋出異常如:

I /#LOGTAG:EXCEPTION的Java。 lang.RuntimeException:無法連接到相機服務


,如果我用我的代碼爲:

   try{ 
       mCamera.stopPreview(); 
       mCamera.release(); 
       if(isChecked){ 
        mCamera=openFrontFacingCamera(); 
       } 
       else{ 
        mCamera=openBackFacingCamera(); 
       } 
       mCamera.startPreview(); 
      }catch(Exception exp){ 
       Log.i("#LOGTAG","EXCEPTION "+exp); 
      } 

我的預覽凍結,回來時,我點擊後退按鈕!


我在做什麼錯了?這是在相機之間切換的正確方法嗎?有人可以幫我嗎?

在此先感謝!

+0

什麼版本的Android?你添加了權限嗎? –

+0

API 13 MIn和API 23 MAX –

+0

我在問你正在使用的設備。它是一個設備還是仿真器? –

回答

0

只需打開這樣所需的攝像機:

對於前置攝像頭:

c = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT); 

對於相機背面:

c = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK); 

,並確保你總是釋放你的相機,當你完成或在您的片段的onPause方法使用以下代碼否則相機實例將永遠不會被釋放,甚至您的主相機應用程序將無法獲得它。

private void releaseCameraAndPreview() { 
    if (mCamera != null) { 
     mCamera.stopPreview(); 
     mCamera.release(); 
     mCamera = null; 
    } 
} 
+0

仍凍結預覽 –

+0

嘗試在您的設備上打開您的主相機應用程序。它工作正常嗎? –

+0

查看Mani對此問題的評論。 – Fildor

相關問題