Android Camera2 API 切换回 - 前置摄像头

标签 android camera camera2 android-camera2

我正在创建一个使用新的 camera2 API 捕捉视频的自定义相机。

我的代码受到 Google 提供的代码的强烈启发 here .我的相机预览有一个按钮,可以从后置摄像头切换到前置摄像头,然后从前置摄像头切换到后置摄像头。 “相机预览” Activity 默认使用后置摄像头启动。

出于某种原因,当我第一次点击“切换/切换摄像头”按钮时,它会按原样出现在前置摄像头上,但每次我再次点击时,切换/swap 不再起作用:预览(在前置摄像头上)有点淡化,就像发生了什么事一样,但它仍保留在当前选择的(前置)摄像头上。

这是我的代码:

RecordVideoFragment 中,在 onViewCreated 中:

//  Switch camera button
        switchCameraButton = (ImageButton) view.findViewById(R.id.button_switch_camera);
        // Listener for Switch cameras button
        switchCameraButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switchCameras();
            }
        });

这里是 switchCameras() 函数:

private void  switchCameras() {
        mCameraOpenCloseLock.release();
        mCameraDevice.close();

        CameraManager mCameraManager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE);
        try {
            String mCameraId = mCameraManager.getCameraIdList()[0];
            if (mCameraId.equals("0")) {   // If currently on FRONT camera (0 = CameraCharacteristics.LENS_FACING_FRONT)
                mCameraId = "1";           // switch to BACK camera (1 = CameraCharacteristics.LENS_FACING_BACK)
                switchCameraButton.setImageResource(R.drawable.ic_camera_front);
            } else {  // If currently on BACK camera
                mCameraId = "0"; // switch to front camera
                switchCameraButton.setImageResource(R.drawable.ic_camera_back);
            }
            try {
                if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA)
                        == PackageManager.PERMISSION_GRANTED) {
                    mCameraManager.openCamera(mCameraId, mStateCallback, null);
                } else {
                    requestVideoPermissions();
                }
            } catch (CameraAccessException e) {
                e.printStackTrace();
            }
        } catch (CameraAccessException e) {
            Toast.makeText(getActivity(), "Cannot access the camera.", Toast.LENGTH_SHORT).show();
            getActivity().finish();
        }
    }

如果你对正在发生的事情有任何想法,那将拯救我。几天来我一直在窃听这个。非常感谢

最佳答案

你需要做的是引入新的变量:

public static final String CAMERA_FRONT = "1";
public static final String CAMERA_BACK = "0";

private String cameraId = CAMERA_BACK;

删除cameraId local variable来自 openCamera 方法。

public void switchCamera() {
    if (cameraId.equals(CAMERA_FRONT)) {
        cameraId = CAMERA_BACK;
        closeCamera();
        reopenCamera();
        switchCameraButton.setImageResource(R.drawable.ic_camera_front);

    } else if (cameraId.equals(CAMERA_BACK)) {
        cameraId = CAMERA_FRONT;
        closeCamera();
        reopenCamera();
        switchCameraButton.setImageResource(R.drawable.ic_camera_back);
    }
}

public void reopenCamera() {
    if (mTextureView.isAvailable()) {
        openCamera(mTextureView.getWidth(), mTextureView.getHeight());
    } else {
        mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
    }
}

关于Android Camera2 API 切换回 - 前置摄像头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39022845/

相关文章:

android - APK 文件作为存档类型存储在设备的下载文件夹中

android - 为什么我在使用抽屉导航时出现错误的图标?

android - Android 上的 Ionic Cordova 相机插件错误

ios - 如何使用闪光灯在自定义相机上拍照?

java - CameraDevice 无法创建 session [Camera2]

android - 点击 Facebook Messenger 聊天项目动画

android - ImageView 不能在 RelativeLayout 中居中

android - 带有相机 2 API 的 Android Lollipop 上的 ZSL 功能

Android Camera2 API 预览有时会失真

Android Camera2,我从 ImageReader 获取 YUV 图像。 U 和 V 缓冲区只有一行(跨步)数据,其余为零