我想在后置摄像头和前置摄像头之间切换以录制视频。这是我的代码:
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();
}
}
在第一例中,后置摄像头的预览是正确的,但是当我尝试更改摄像机时崩溃:
更改的按钮是:
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;
}
}
}
});
不幸的是,Android Camera API并不容易理解。有两个 int 常数:
public final static int Camera.CameraInfo.CAMERA_FACING_BACK = 0;
public final static int Camera.CameraInfo.CAMERA_FACING_FRONT = 1;
和一些方法,例如camer.open()期望 int cameraId
参数。
但是,将上面的常数用于camera.open()或camcorderprofile.get()是错误的。 cameraid 是 0 对于第一个相机, 1 在第二个相机中, 2 用于第三,so on,so on,so on到Camera.getNumberOfCameras()-1
。您可以检查具有某些 cameraid 的相机的方向,如下:
Camera camera = Camera.open(cameraId);
int facing = camera.getCameraInfo().facing();
面对的值可以保证为相机