2016-02-11 73 views
1

我在Camera.getCameraInfo(cameraId,info);在表面視圖中打開前置攝像頭

我的代碼變得異常java.lang.RuntimeException: Fail to get camera info 是:

public void surfaceCreated(SurfaceHolder holder) { 
    int cameraId = -1; 
    for(int i=0;i<Camera.getNumberOfCameras();i++){ 
     Camera.CameraInfo info = new Camera.CameraInfo(); 
     Camera.getCameraInfo(cameraId,info); 
     if(info.facing== Camera.CameraInfo.CAMERA_FACING_FRONT){ 
      cameraId = i; 
      break; 
     } 
    } 
    camera = Camera.open(cameraId); 
} 

和清單還具有:

<uses-permission android:name="android.permission.CAMERA" /> 

<uses-feature android:name="android.hardware.camera" /> 
<uses-feature android:name="android.hardware.camera.front" /> 
<uses-feature android:name="android.hardware.camera.autofocus" /> 

缺少什麼東西,我該如何解決這個問題? 歡迎任何幫助。

+0

[如何打開 「前置攝像頭」 Android平臺?(HTTP的可能重複:// stackoverflow.com/questions/2779002/how-to-open-front-camera-on-android-platform) – Madhur

+0

謝謝@Madhur!但我得到異常親愛的:) – Shivam

+0

嘗試獲取cameraId活動oncreate方法和打開相機在surfacechanged。 –

回答

0

我改變了方法;以前我在執行SurfaceHolder.Callback,但現在我創建了它的對象。

我感動代碼SurfaceCreatedonResume()

public void onResume() { 
    super.onResume(); 
    for(int i=0;i<Camera.getNumberOfCameras();i++){ 
     Camera.CameraInfo info = new Camera.CameraInfo(); 
     Camera.getCameraInfo(i,info); 
     if(info.facing== Camera.CameraInfo.CAMERA_FACING_FRONT){ 
      cameraId = i; 
      break; 
     } 
    } 
    camera=Camera.open(cameraId); 
    camera.startPreview(); 
} 

和回調的對象是這樣的:

SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() { 
    public void surfaceCreated(SurfaceHolder holder) { 
     // no-op -- wait until surfaceChanged() 

    } 
    public void surfaceChanged(SurfaceHolder holder, 
           int format, int width, 
           int height) { 
     Camera.Parameters parameters=camera.getParameters(); 
     Camera.Size size=getBestPreviewSize(width, height, 
        parameters); 
     Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 

     if (size!=null) { 
      parameters.setPreviewSize(size.width, size.height); 
      camera.setParameters(parameters); 
      camera.setDisplayOrientation(90); 
      cameraConfigured=true; 
     } 
     camera.startPreview(); 
    } 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // no-op 
    } 
}; 

這解決了我的問題。

1

由於您將cameraId初始化爲-1,這是錯誤的,您將收到異常。 並通過它來獲取攝像機信息

Camera.getCameraInfo(cameraId,info);

初始化cameraId比0拿到了從異常掉。

+0

是的。謝謝!! 但現在出現的屏幕是黑色的,沒有顯示前置攝像頭視圖。 – Shivam

+0

提供您的完整代碼,看看有什麼問題.. 也標記爲正確的答案 –

+0

我已經發布了一個答案,請參閱,它會很好,如果你可以改善這一點。 – Shivam

0

此方法將返回前置攝像頭編號:

private int getFrontCameraId(){ 
      int camId = -1; 
      int numberOfCameras = Camera.getNumberOfCameras(); 
      Camera.CameraInfo ci = new Camera.CameraInfo(); 

      for(int i = 0;i < numberOfCameras;i++){ 
       Camera.getCameraInfo(i,ci); 
       if(ci.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){ 
        camId = i; 
       } 
      } 

      return camId; 
     } 

通過這個ID在這裏:camera=Camera.open(getFrontCameraId());

相關問題