首页 > 解决方案 > Android 11 上 imageCapture 用例的 camerax“未绑定到有效相机”

问题描述

我一直收到错误

未绑定到有效的相机

尝试实现 imageCapture 用例时。我正在按照此处的 camerax 教程在 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)

任何人都面临类似的问题?任何指针?

标签: javaandroidcameraandroid-camera

解决方案


要解决此问题,您必须将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实现


推荐阅读