切换前后摄像头

3
我正在使用Google提供的camera2示例,它运行良好。但是我该如何通过按钮在后置和前置摄像头之间切换?
private void setUpCameraOutputs(int width, int height) {
    Activity activity = getActivity();
    CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);
    try {
        for (String cameraId : manager.getCameraIdList()) {
            CameraCharacteristics characteristics
                    = manager.getCameraCharacteristics(cameraId);

            // We don't use a front facing camera in this sample. Para trocar, colocar != no lugar de ==.
            if (characteristics.get(CameraCharacteristics.LENS_FACING)
                    == CameraCharacteristics.LENS_FACING_FRONT) {
                continue;
            }

            StreamConfigurationMap map = characteristics.get(
                    CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);

            // For still image captures, we use the largest available size.
            Size largest = Collections.max(
                    Arrays.asList(map.getOutputSizes(ImageFormat.JPEG)),
                    new CompareSizesByArea());
            mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(),
                    ImageFormat.JPEG, /*maxImages*/2);
            mImageReader.setOnImageAvailableListener(
                    mOnImageAvailableListener, mBackgroundHandler);

            // Danger, W.R.! Attempting to use too large a preview size could  exceed the camera
            // bus' bandwidth limitation, resulting in gorgeous previews but the storage of
            // garbage capture data.
            mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class),
                    width, height, largest);

            // We fit the aspect ratio of TextureView to the size of preview we picked.
            int orientation = getResources().getConfiguration().orientation;
            if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
                mTextureView.setAspectRatio(
                        mPreviewSize.getWidth(), mPreviewSize.getHeight());
            } else {
                mTextureView.setAspectRatio(
                        mPreviewSize.getHeight(), mPreviewSize.getWidth());
            }

            mCameraId = cameraId;
            return;
        }
    } catch (CameraAccessException e) {
        e.printStackTrace();
    } catch (NullPointerException e) {
        // Currently an NPE is thrown when the Camera2API is used but not supported on the
        // device this code runs.
        new ErrorDialog().show(getFragmentManager(), "dialog");
    }
}

`

1个回答

5
@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.btn_switch_camera:

            closeCamera();
            if (mCameraId.equals("0")) {
                mCameraId = "1";
            } else {
                mCameraId = "0";
            }
            CameraManager cameraManager = (CameraManager) Camera2Demo.this.getSystemService(Context.CAMERA_SERVICE);
            try {
                cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, mHandler);
            } catch (CameraAccessException e) {
                e.printStackTrace();
            }

            break;
    }
}

这里的函数 "closeCamera()" 是用来关闭相机的。
 private void closeCamera() {
    mSession.close();
    mSession = null;
    mCameraDevice.close();
    mCameraDevice = null;
}

OP从未回来,但我演示了这段完全相同的代码,并且它可以工作。这正是我所需要的。 - john.weland
如果前置和后置摄像头的大小/宽高比不同,那么该方法将对前置摄像头使用错误的宽高比。你有解决办法吗? - gbhall
感谢您提供的解决方案。这段代码在前置和后置摄像头旋转时都能很好地运行。但是,当我使用前置摄像头并单击保存图片按钮时,它无法保存照片。后置摄像头确实可以拍照。 - Stephen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接