2016-06-28 67 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

相关问题