suanido
suanido

Reputation: 761

Fail to connect to camera service in Android

I'd like to switch between back and front camera to record a video. This is my code:

public void surfaceCreated(SurfaceHolder holder) {

    if (usecamera) {
        camera = Camera.open(0);
        camera.setDisplayOrientation(90);

        try {
            camera.setPreviewDisplay(holder);
            camera.startPreview();
            previewRunning = true;
        }
        catch (IOException e) {
            Log.e(LOGTAG,e.getMessage());
            e.printStackTrace();
        }   
    }       

}


public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    if (!recording && usecamera) {
        if (previewRunning){
            camera.stopPreview();
        }

        try {
            Camera.Parameters p = camera.getParameters();

            p.setPreviewSize(camcorderProfile.videoFrameWidth, camcorderProfile.videoFrameHeight);

            camera.setParameters(p);

            camera.setPreviewDisplay(holder);
            camera.startPreview();
            previewRunning = true;
        }
        catch (IOException e) {
            Log.e(LOGTAG,e.getMessage());
            e.printStackTrace();
        }   

        prepareRecorder();  
    }
}


public void surfaceDestroyed(SurfaceHolder holder) {
    if (recording) {
        recorder.stop();
        recording = false;
    }
    recorder.release();
    if (usecamera) {
        previewRunning = false;
        //camera.lock();
        camera.release();
    }

}

In the first instance the preview of the back camera is correct, but crash when I try to change the camera:

The button for change is:

changeCamera.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {

             if (Camera.getNumberOfCameras()>=2) {
                    camera.stopPreview();
                    camera.release();
                    //"which" is just an integer flag
                    switch (which) {
                    case 0:
                        camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
                        which = 1;
                        break;
                    case 1:
                        camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
                        which = 0;
                        break;
                    }
                    try {
                        camera.setPreviewDisplay(holder);
                        camera.startPreview();
                    } catch (IOException exception) {
                        camera.release();
                        camera = null;
                    }
                }

        }
    });

Upvotes: 0

Views: 417

Answers (1)

Alex Cohn
Alex Cohn

Reputation: 57203

Unfortunately, Android Camera API is not easy to understand. There are two int constants:

public final static int Camera.CameraInfo.CAMERA_FACING_BACK = 0;
public final static int Camera.CameraInfo.CAMERA_FACING_FRONT = 1;

and there are methods, like Camera.open() that expect int cameraId parameter.

But it is a mistake to use the constants above for Camera.open() or CamcorderProfile.get(). The cameraId is 0 for first camera, 1 for the second, 2 for third, an so on, up to Camera.getNumberOfCameras()-1. You can check the direction of a camera with certain cameraId as follows:

Camera camera = Camera.open(cameraId);
int facing = camera.getCameraInfo().facing();

The value of facing is guaranteed to be either Camera.CameraInfo.CAMERA_FACING_BACK or Camera.CameraInfo.CAMERA_FACING_FRONT.

Upvotes: 2

Related Questions