【问题标题】:How to swtich from back camera to front camera on button click?如何在单击按钮时从后置摄像头切换到前置摄像头?
【发布时间】:2015-11-30 06:12:30
【问题描述】:

我知道我问的问题可能是重复的。 但我尝试了所有的东西,但没有成功。 我尝试了以下方法来切换相机:

numberOfCamera = Camera.getNumberOfCameras();
            if(camId == Camera.CameraInfo.CAMERA_FACING_BACK){
                camId = Camera.CameraInfo.CAMERA_FACING_FRONT;
                Toast.makeText(getApplicationContext(), "BACK TO FRONT" ,
    1000).show();
                    try {
                        camera.release();
                        camera = Camera.open(camId);
                        camera.setPreviewDisplay(surfaceHolder);
                        camera.startPreview();
                        previewing = true;
                    } catch (RuntimeException e) {

                } catch (IOException e) {}
            }else if(camId == Camera.CameraInfo.CAMERA_FACING_FRONT){
                camId = Camera.CameraInfo.CAMERA_FACING_BACK;
                Toast.makeText(getApplicationContext(), "FRONT TO BACK" , 



     1000).show();
                        try {
                            camera.release();
                            camera = Camera.open(camId);
                            camera.setPreviewDisplay(surfaceHolder);
                            camera.startPreview();
                        } catch (RuntimeException e) {

                } catch (IOException e) {}
            }

--此代码不起作用..它正在显示 toast..但不切换相机。

【问题讨论】:

  • 在您的代码中,为每个异常调用 e.printStackTrace(),并获取日志并将其发布在此处。
  • 尝试在camera.release()之前调用camera.stopPreview()
  • @calvinify .. 不工作
  • 请将Log.e("CameraSwitch", "failed to open camera " + camId, e)添加到catch (RuntimeException e),让我们看看运行时异常。

标签: android camera android-camera


【解决方案1】:

这就是我在一个业余项目中的做法。这是一个custom surface view,它定义了一个切换相机的方法。

注意: 根据 Alex 的评论,我最初的回答是不正确的。我已经更新了答案,但我没有对其进行测试,也没有更新上面链接的文件。

以下是所做工作的摘要:

您需要在类变量中使用当前的相机 ID

int currentCameraId;

备份 Camera.Parameters

您需要稍后重用高度和宽度信息。

Camera.Parameters parameters = camera.getParameters();

停止预览

if (inPreview) {
  camera.stopPreview();
}

释放相机

camera.release();

获取新的相机 ID

int cameraCount = Camera.getNumberOfCameras();
if (cameraCount == 2) {
    // simply switch between 0 and 1 if there are only 2 cameras
    currentCameraId = currentCameraId == 0 ? 1 : 0;
} else {
    Camera.CameraInfo currentCameraInfo = new Camera.CameraInfo();
    Camera.getCameraInfo(currentCameraId, currentCameraInfo);
    // switch between front and back facing
    int wantedCameraFacing = currentCameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT ? Camera.CameraInfo.CAMERA_FACING_BACK : Camera.CameraInfo.CAMERA_FACING_FRONT;
    currentCameraId = switchCamera(cameraCount, wantedCameraFacing);
}

switchCamera 方法(未经测试)

int switchCamera(int cameraCount, int wantedCameraFacing) {
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
    for (int camId = 0; camId < cameraCount; camId++) {
        Camera.getCameraInfo(camId, cameraInfo);
        if (cameraInfo.facing == wantedCameraFacing) {
            // selects the 1st camera which faces the correct way
            return camId;
        }
    }
}

打开相机

camera = Camera.open(currentCameraId);

使用保存的参数初始化预览

camera.setPreviewDisplay(sHolder);
// define parameters, e.g. parameters.setPreviewSize()
camera.setParameters(parameters);

开始预览

camera.startPreview();

用法

在您的活动布局中设置此自定义视图。为按钮的onClick 操作创建一个回调函数。然后你可以简单地调用:

public void switchCamera(View v) {
      preview.switchCamera();
}

【讨论】:

  • 确实CameraInfoCamera.open() 的参数之间似乎没有任何关系,我想我只是幸运。感谢您指出这一点。
  • 请您修改您的答案好吗?
  • 这个应该可以,但我没有测试过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
相关资源
最近更新 更多