Reputation: 761
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
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