java - 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)
任何人都面临类似的问题?任何指针?
解决方案
要解决此问题,您必须将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实现
推荐阅读
- html - 谷歌字体图标
- javascript - 如何从 onclick 事件中显示列和行中的数据
- python - 列表类型不可调用
- vue.js - Vue变量未在方法的异步中更新
- angular - 当数据未更改时,Angular 11 Router 可观察数据未更新
- json - 无法将 JSON 数据打印到 Dart 对象中 - “'对象'的实例”
- javascript - 使用 jquery 从任何下拉列表中获取值
- javascript - 未捕获的错误:目标容器不是 DOM 元素
- python - 如何将两个 DateTimeFields 与当前时间进行比较
- python - 如何使用 PyTorch 编码器重塑多通道图像?