首页 > 解决方案 > Android:(Camera2)相机从活动返回后不再存在异常

问题描述

我一直在练习使用Camera2API 在 android 上设置相机并SurfaceView在屏幕上显示预览。但是,在从子活动返回后尝试创建一个异常时抛出异常CameraCaptureSession,该子活动的目的只是为相机选择一个配置。

抛出的异常是:

E/CameraCaptureSession: Session 0: Failed to create capture session; configuration failed
android.hardware.camera2.CameraAccessException: CAMERA_DISCONNECTED (2): createStream:632: Camera device no longer alive

从相机设备创建捕获会话时,函数会引发此异常,如下所示:

private void startPreview() {
    try {
        final Surface previewSurface = this.cameraSurfaceView.getHolder().getSurface();
        List<Surface> targetSurfaces = Collections.singletonList(previewSurface);
        final CaptureRequest.Builder captureRequestBuilder = this.cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);

        captureRequestBuilder.addTarget(previewSurface);

        this.cameraDevice.createCaptureSession(targetSurfaces, new CameraCaptureSession.StateCallback() {
            @Override
            public void onConfigured(@NonNull CameraCaptureSession session) {
                try {
                    if (cameraDevice == null) {
                        return;
                    }

                    captureSession = session;

                    captureRequest = captureRequestBuilder.build();

                    session.setRepeatingRequest(captureRequest, null, cameraHandler);
                } catch (CameraAccessException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onConfigureFailed(@NonNull CameraCaptureSession session) {

            }
        }, this.cameraHandler);
    } catch (CameraAccessException e) {
        final String message = "Unable to start preview";

        Log.e(TAG, message, e);
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    }
}

此异常有一个问题,因此应用程序不会崩溃,但是即使出现此异常,似乎上一个活动的新设置仍在工作(目前它只是更改相机 ID)。

起初我认为这可能是因为当新活动开始时我没有关闭资源所以这不会发生,所以我为此创建的函数如下所示:

@Override
protected void onStop() {
    super.onStop();

    if (this.captureSession != null) {
        try {
            this.captureSession.stopRepeating();
            this.captureSession.close();

            this.captureSession = null;
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }

    if (this.cameraDevice != null) {
        this.cameraDevice.close();

        this.cameraDevice = null;
    }

    this.cameraSurfaceView.getHolder()
        .getSurface()
        .release();
}

这就是SurfaceView管理的方式

@Override
protected void onInitialize() {
    this.cameraSurfaceView.getHolder()
        .addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                Log.d(TAG, "Camera surface view created");

                initializeCamera();
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {

            }
        });
}

但即使这样也不能解决错误。我担心这个异常,我想修复它。我只是不知道此时还能做什么。SurfaceView执行相机打开的代码来自

标签: android

解决方案


推荐阅读