1

I am getting exception java.lang.RuntimeException: Fail to get camera info at Camera.getCameraInfo(cameraId,info);

My code is:

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

and manifest also have:

<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" />

What thing is missing, and how can I solve that? Any help is welcome.

Shivam
  • 649
  • 2
  • 8
  • 20

3 Answers3

2

I changed the approach; previously I was implementing SurfaceHolder.Callback but now I created its object.

I moved code from SurfaceCreated to onResume()

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

And the object of Callback is like:

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

This solved my problem.

Shivam
  • 649
  • 2
  • 8
  • 20
1

You are getting exception because you initializing cameraId to -1 which is wrong. and passing it to get Camera info

Camera.getCameraInfo(cameraId,info);

initialize cameraId to 0 to get rid from exception.

MUHAMMAD SOBAN
  • 403
  • 8
  • 20
-1

This Method will return the front Camera Id:

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

Pass this id here : camera=Camera.open(getFrontCameraId());

Abhishek
  • 1,654
  • 2
  • 18
  • 31