无法连接到Android中的相机服务



我想在后置摄像头和前置摄像头之间切换以录制视频。这是我的代码:

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

面对的值可以保证为相机

最新更新