Java camerax“;未绑定到有效的摄像头";Android 11上的imageCapture用例

Java camerax“;未绑定到有效的摄像头";Android 11上的imageCapture用例,java,android,camera,android-camera,Java,Android,Camera,Android Camera,我一直在犯错误 未绑定到有效的摄影机 尝试实现imageCapture用例时。在camerax教程之后,我将用Java实现该特性 预览用例正确绑定,我可以在启动活动时访问相机,但当我点击“拍照”按钮时,我得到以下错误: Photo capture failed: ${exception.message} androidx.camera.core.ImageCaptureException: Not bound to a valid Camera [ImageCapture:android

我一直在犯错误

未绑定到有效的摄影机

尝试实现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)

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

要解决此问题,必须将用例的集合绑定到生命周期所有者

cameraProvider.bindToLifecycle(
   this, cameraSelector, preview, imageCapture)
用例是什么

用例提供了映射用例中参数集的功能 摄像机可用的参数的大小写。用例也将 将激活/非激活状态的信息传送给摄像机

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

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);
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)
现在,您可以使用以下方法进行绑定:

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)
对于exmaple,我的主要活动中有以下代码:

对于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);
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)
UseCase-imageCapture=new-imageCapture.Builder()
.setCaptureMode(图像捕获.CAPTURE\u模式\u最大化质量)
.build();
ListenableFuture providerListenableFuture=ProcessCameraProvider.getInstance(此);
ProcessCameraProvider ProcessCameraProvider=providerListenableFuture.get();
processCameraProvider.bindToLifecycle(这个,CameraSelector.DEFAULT\u BACK\u CAMERA,imageCapture);
对于科特林

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);
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)
val outputFileOptions=ImageCapture.outputFileOptions.Builder(file.build)()
val imageCapture=imageCapture.Builder()
.setCaptureMode(图像捕获.CAPTURE\u模式\u最大化质量)
.build()
val cameraProviderFuture:ListenableFuture=ProcessCameraProvider.getInstance(此)
val processCameraProvider=cameraProviderFuture.get()
processCameraProvider.bindToLifecycle(此,CameraSelector.DEFAULT\u BACK\u CAMERA,imageCapture)

有关更多详细信息,请参阅官方文档中的CameraX版本

查看此答案-谢谢@HB。我通过在takePhoto函数中包含bind语句来实现它。本教程中没有明确提到这一点。因此,对于学习本教程的任何人,除了在startCamera函数中生成bind语句外,请在takePhoto函数中包含类似的bind调用,附加imageCapture用例。请在回答中添加其他详细信息这也适用于VideoCapture