java - Camera2BasicFragment - 修改以切换前置/后置摄像头时出现问题

标签 java android android-camera android-camera2

我正在尝试修改 Camera2BasicFragment 示例项目以支持前后摄像头之间的切换。 我在预览屏幕上添加了一个切换按钮覆盖,以及以下代码来处理点击。还有一个类变量 cameraDirection 用于记住当前正在使用的相机:

@Override
public void onClick(View view) {
    switch (view.getId()) {
        case R.id.button_take_photo:
            takePicture();
            break;

        case R.id.button_reverse_camera:
            CameraManager manager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE);
            try {
                String[] cameraIds = manager.getCameraIdList();
                CameraCharacteristics cameraCharacteristics = manager.getCameraCharacteristics(mCameraId);
                for (String id : cameraIds) {
                    if (! id.equals(mCameraId)) {
                        closeCamera();
                        cameraDirection = cameraDirection == CameraCharacteristics.LENS_FACING_FRONT?CameraCharacteristics.LENS_FACING_BACK:
                                CameraCharacteristics.LENS_FACING_FRONT;
                        mCameraId = id;
                        openCamera(mPreviewSize.getWidth(), mPreviewSize.getHeight());
                    }
                }

            } catch (CameraAccessException e) {
                e.printStackTrace();
            }
            break;

    }
}

烦人的是相机的第一个开关工作正常。但是后续的开关不起作用。发生的事情是预览有点淡化,就像正在发生的事情一样,但它仍保留在当前选定的相机上。再点击几下切换按钮后,应用程序崩溃了,更烦人的是没有堆栈跟踪。所以我不知道问题出在哪里。 我怀疑相机锁未正确解锁,但这只是猜测。

所以我希望有人已成功修改此示例以处理相机切换,或者可以推荐替代的 Camera2 fragment 实现。

最佳答案

问题出在方法 setUpCameraOutputs(int width, int height) 中,它设置了 mCameraId=cameraId;,因为正如它在评论中所说的那样

// We don't use a front facing camera in this sample.

我试过

if(mCameraId==null){
    mCameraId=cameraId;
}

但这还不够,因为它没有为我正确设置预览大小。

您可以将方法修改为 setUpCameraOutputs(int width, int height, String cameraId) 并正确进行设置。

关于java - Camera2BasicFragment - 修改以切换前置/后置摄像头时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35245224/

相关文章:

java.lang.ClassFormatError : Invalid constant pool index 63

java - JPanel 不调用自定义 LayoutManager 的 addLayoutComponent()

android - 从 Firebase 存储中获取图像

android - WebView 视频不在 Android 2.3 中播放

android - 如何将 OpenGl 对象添加到 surfaceView 相机中?

android - 使用没有 surfaceview 或 textureview 的相机

java - 从JOGL最新master解析NewtCanvasJFX

java - 如何正确地对可打包对象进行单元测试?

android - android 2.3.6 中的相机方向

Java Streams Map,从键获取值 - List<Integer>(带过滤)