【问题标题】:camerax "Not bound to a valid Camera" for imageCapture use case on Android 11Android 11 上 imageCapture 用例的 camerax“未绑定到有效的相机”
【发布时间】:2020-11-17 06:35:52
【问题描述】:

我一直收到错误

未绑定到有效的相机

尝试实现 imageCapture 用例时。我正在按照camerax教程here在Java中实现该功能。

预览用例绑定正确,我可以在启动活动时访问相机,但是当我点击“拍照”按钮时,我收到以下错误:

Photo capture failed: ${exception.message}
    androidx.camera.core.ImageCaptureException: Not bound to a valid Camera [ImageCapture:androidx.camera.core.ImageCapture-9aad1b57-8fb6-4a6e-b528-9347343369b6]
        at androidx.camera.core.ImageCapture.lambda$sendImageCaptureRequest$6$ImageCapture(ImageCapture.java:825)
        at androidx.camera.core.-$$Lambda$ImageCapture$2B91NcXQyr59NDscigcxsZb94mc.run(Unknown Source:4)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

有人遇到类似问题吗?有什么指点吗?

【问题讨论】:

  • 谢谢@HB。我通过在 takePhoto 函数中包含绑定语句来使其工作。教程中没有明确提到这一点。因此,对于遵循本教程的任何人,除了在 startCamera 函数中创建绑定语句外,请在 takePhoto 函数中包含类似的绑定调用,附加 imageCapture 用例。

标签: java android camera android-camera


【解决方案1】:
cameraProvider.bindToLifecycle(
   this, cameraSelector, preview, imageCapture)

【讨论】:

  • 请在您的回答中添加更多详细信息
【解决方案2】:

要解决此问题,您必须将 UseCase 的集合绑定到 lifeCycleOwner

用例是什么

UseCase 提供映射使用中的参数集的功能 相机可以使用的参数的案例。 UseCase 也将 将活动/非活动状态传达给相机。

首先,您的 build.gradel 中必须有以下依赖项:

dependencies {
        /*
          rest of your implementation
        */
        // CameraX core library using the camera2 implementation
        def camerax_version = "1.1.0-alpha03"
        // The following line is optional, as the core library is included indirectly by camera-camera2
        implementation "androidx.camera:camera-core:${camerax_version}"
        implementation "androidx.camera:camera-camera2:${camerax_version}"
        // If you want to additionally use the CameraX Lifecycle library
        implementation "androidx.camera:camera-lifecycle:${camerax_version}"
  }

现在您可以使用以下方法绑定它:

public androidx.camera.core.Camera bindToLifecycle(@NonNull @NotNull androidx.lifecycle.LifecycleOwner lifecycleOwner,
                                                   @NonNull @NotNull androidx.camera.core.CameraSelector cameraSelector,
                                                   @NonNull @NotNull androidx.camera.core.UseCase... useCases)

例如,我的 MainActivity 中有这段代码:

对于java

UseCase imageCapture = new ImageCapture.Builder()
            .setCaptureMode(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY)
            .build();

ListenableFuture<ProcessCameraProvider> providerListenableFuture = ProcessCameraProvider.getInstance(this);
ProcessCameraProvider processCameraProvider = providerListenableFuture.get();
processCameraProvider.bindToLifecycle(this, CameraSelector.DEFAULT_BACK_CAMERA, imageCapture);

对于 Kotlin

val outputFileOptions = ImageCapture.OutputFileOptions.Builder(file).build()
val imageCapture = ImageCapture.Builder()
                .setCaptureMode(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY)
                .build()

val cameraProviderFuture: ListenableFuture<ProcessCameraProvider> = ProcessCameraProvider.getInstance(this)
val processCameraProvider = cameraProviderFuture.get()
processCameraProvider.bindToLifecycle(this, CameraSelector.DEFAULT_BACK_CAMERA, imageCapture)

更多详情请咨询CameraX官方文档implementation

【讨论】:

  • 什么是 processCameraProvider,我看到的所有示例都只使用带有 Executor 的相机提供程序,我该如何使用它?
【解决方案3】:

确保在执行 startCamera 时还​​绑定 previewimageCapture

// Bind use cases to camera    
cameraProvider.bindToLifecycle(this, cameraSelector, imageCapture, preview)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    相关资源
    最近更新 更多