【问题标题】:Android - CameraDevice was already closedAndroid - CameraDevice 已关闭
【发布时间】:2017-08-31 21:40:27
【问题描述】:

我一直在尝试将 Camera2 api 集成到我的应用中。当我从纵向模式切换到横向时,它会引发异常

    java.lang.IllegalStateException: CameraDevice was already closed
at android.hardware.camera2.impl.CameraDeviceImpl.checkIfCameraClosedOrInError(CameraDeviceImpl.java:1984)
at android.hardware.camera2.impl.CameraDeviceImpl.submitCaptureRequest(CameraDeviceImpl.java:825)
at android.hardware.camera2.impl.CameraDeviceImpl.setRepeatingRequest(CameraDeviceImpl.java:880)
at android.hardware.camera2.impl.CameraCaptureSessionImpl.setRepeatingRequest(CameraCaptureSessionImpl.java:231)
at com.essentialsln.memtalk.ui.fragments.Camera2Fragment$11.onConfigured(Camera2Fragment.java:795)
at java.lang.reflect.Method.invoke(Native Method)
at android.hardware.camera2.dispatch.InvokeDispatcher.dispatch(InvokeDispatcher.java:39)
at android.hardware.camera2.dispatch.HandlerDispatcher$1.run(HandlerDispatcher.java:65)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.os.HandlerThread.run(HandlerThread.java:61)

【问题讨论】:

  • 你找到解决方法了吗?

标签: android android-camera2 device-orientation


【解决方案1】:

我遇到了类似的问题,这对我有帮助。如果您一直在引用 Sample app,则应通过覆盖 onClosed(CameraDevice) 方法来停止 CameraDevice.StateCallback 中的线程:

 mCameraDevice.createCaptureSession(outputSurfaces,
                new CameraCaptureSession.StateCallback() {

                    @Override
                    public void onClosed(@NonNull CameraCaptureSession session) {
                        super.onClosed(session);
                        stopBackgroundThread();
                    } 

【讨论】:

    【解决方案2】:

    在我的情况下,此错误之前是

    2020-12-15 18:31:55.703 5079-5079/com.android.example.camera2.video W/CameraDevice-JV-0: Stream configuration failed due to: createStream:1008: Camera 0: Surface already has a stream created for it (ID 0)
    2020-12-15 18:31:55.704 5079-5079/com.android.example.camera2.video E/CameraCaptureSession: Session 0: Failed to create capture session; configuration failed
    

    问题是我将表面添加到列表中并将其添加为目标但没有清除它。 我在updateRepeatingRequest之前也是setRepeatingRequestoverride fun onConfigured(s: CameraCaptureSession) {

    清除 initializeCamera() 中的表面并删除额外的 updateRepeatingRequest 为我修复了它。

    【讨论】:

    • 听起来像是正确的答案——但我不明白——你能更好地解释一下或给出代码示例吗?您可以在开始时设置所有可能的表面,不是吗?并在启动之前将表面添加到每个 setRepeatingRequest。更换前需要清理表面吗?在任何实践中从未见过,但这是有道理的。
    • 这是很久以前的事了,但我想如果你在onConfigured 之前做setRepeatingRequest 你会得到这个错误(我没有再次确认)。您可以查看我的工作应用程序,了解如何处理代码https://source.codeaurora.org/quic/la/camera-samples
    • 关于清除表面部分。我现在在https://source.codeaurora.org/quic/la/camera-samples 中的CameraBase.kt 中的onClosed 中的clearStreams() 中执行此操作。我现在相信这是一个不同的错误。 (您可以通过删除它来检查错误)
    • 非常感谢 - 我会检查一下。
    猜你喜欢
    • 2023-02-04
    • 2019-06-09
    • 2014-12-11
    • 1970-01-01
    • 2011-10-29
    • 2012-09-07
    • 2014-08-28
    • 2011-09-26
    • 2013-07-30
    相关资源
    最近更新 更多