【问题标题】:Fail to connect to camera service in AndroidAndroid 连接相机服务失败
【发布时间】:2014-01-24 12:54:33
【问题描述】:

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

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

        }
    });

【问题讨论】:

  • 请将您在 logcat 中看到的消息发布。可能不仅有你应用的异常堆栈,还有来自相机服务的一些错误消息。

标签: android video android-camera surfaceview record


【解决方案1】:

很遗憾,Android Camera API 不容易理解。有两个intconstants

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

还有一些方法,比如 Camera.open() 需要 int cameraId 参数。

但是将上面的常量用于Camera.open()CamcorderProfile.get() 是错误的。 cameraId0 表示第一个相机,1 表示第二个,2 表示第三个,依此类推,向上到Camera.getNumberOfCameras()-1。您可以通过以下方式检查具有特定 cameraId 的相机的方向

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

face 的值保证为Camera.CameraInfo.CAMERA_FACING_BACKCamera.CameraInfo.CAMERA_FACING_FRONT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-23
    • 2018-03-12
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2017-09-10
    相关资源
    最近更新 更多