createCameraPreviewSession:Surface 没有有效的原生 window - 第二次创建时出错

createCameraPreviewSession: Surface had no valid native window - error on second creation

我们从 Ionic 调用一个自定义 Cordova 插件,它使用 Camera2 API 来捕获帧。在 Ionic 中第二次调用此插件时(随后),我们 有时 (就像十分之一的情况一样)出现以下错误:

2019-01-14 18:08:16.471 31738-31738/io.ionic.starter E/Legacy-CameraDevice-JNI: getNativeWindow: Surface had no valid native window.
2019-01-14 18:08:16.472 31738-31738/io.ionic.starter E/Legacy-CameraDevice-JNI: LegacyCameraDevice_nativeDetectSurfaceDimens: Could not retrieve native window from surface.
2019-01-14 18:08:16.472 31738-31738/io.ionic.starter D/AndroidRuntime: Shutting down VM
2019-01-14 18:08:16.472 31738-31738/io.ionic.starter E/AndroidRuntime: FATAL EXCEPTION: main
    Process: io.ionic.starter, PID: 31738
    java.lang.UnsupportedOperationException: Unknown error -22
        at android.hardware.camera2.legacy.LegacyExceptionUtils.throwOnError(LegacyExceptionUtils.java:77)
        at android.hardware.camera2.legacy.LegacyCameraDevice.getSurfaceSize(LegacyCameraDevice.java:583)
        at android.hardware.camera2.utils.SurfaceUtils.getSurfaceSize(SurfaceUtils.java:68)
        at android.hardware.camera2.params.OutputConfiguration.<init>(OutputConfiguration.java:237)
        at android.hardware.camera2.params.OutputConfiguration.<init>(OutputConfiguration.java:101)
        at android.hardware.camera2.impl.CameraDeviceImpl.createCaptureSession(CameraDeviceImpl.java:499)

        at dev.capture.Camera2Scanner.createCameraPreviewSession(Camera2Scanner.java:675)
        at dev.capture.Camera2Scanner.access0(Camera2Scanner.java:47)
        at dev.capture.Camera2Scanner.onOpened(Camera2Scanner.java:191)

        at android.hardware.camera2.impl.CameraDeviceImpl.run(CameraDeviceImpl.java:139)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6938)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

所以我检查了 Android JNI 源中的这个错误,那里说当 getNativeWindow() returns null 时抛出这个错误。但是这个功能到底是做什么的,这对我们的表面意味着什么?

您向 CameraDevice.createCaptureSession 传递了一个不再有效的 Surface;通常这是因为无论您从哪里获得 Surface 都已被垃圾回收,或者因为它绘制到的 UI 元素不再有效。

因此,如果 SurfaceView 无法再绘制,或者 ImageReader 已被释放等,您可能会收到此错误。你需要梳理出哪个Surface是无效的,然后弄清楚为什么它的源头已经不好了。