'Problem with binding camerax on android api 26
I have such error:
Use case binding failed No supported surface combination is found for camera device - Id : 1. May be attempting to bind too many use cases. Existing surfaces: [] New configs: [androidx.camera.core.impl.PreviewConfig@43936ec, androidx.camera.core.impl.ImageCaptureConfig@1a07ab5, androidx.camera.video.impl.VideoCaptureConfig@3b5954a]
I think it is connected with this code scope:
private fun startCamera() {
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
// Used to bind the lifecycle of cameras to the lifecycle owner
val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
// Unbind use cases before rebinding
cameraProvider.unbindAll()
// Preview
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(binding.previewView.surfaceProvider)
}
// Select back camera as a default
val cameraSelector = if (intent.extras?.getBoolean("default_cam") == true) CameraSelector.DEFAULT_BACK_CAMERA else CameraSelector.DEFAULT_FRONT_CAMERA
try {
// Bind use cases to camera
cameraProvider.bindToLifecycle(
this, cameraSelector, preview, imageCapture, videoCapture)
} catch (exc: Exception) {
println("Use case binding failed ${exc.localizedMessage}")
}
}, ContextCompat.getMainExecutor(this))
val recorder = Recorder.Builder()
.setQualitySelector(QualitySelector.from(Quality.LOWEST))
.build()
videoCapture = VideoCapture.withOutput(recorder)
imageCapture = ImageCapture.Builder().apply {
setTargetRotation(Surface.ROTATION_0)
setTargetResolution(Size(720, 1280))
}.build()
}
As you can see I unbinded all use cases before new binding. This code is located in my activity, and the strange issue is that I don't see any preview on android 7,7.1,7.2 but I see it on android 8+. I removed android:hardwareAccelerated=true from my AndroidManifest.xml but it didn't help me :(
UPDATE
One of possible solutions is posted here and is connected with binding all use cases simultaneously. So with this line:
cameraProvider.bindToLifecycle(this, cameraSelector, preview)
instead of this:
cameraProvider.bindToLifecycle(
this, cameraSelector, preview, imageCapture, videoCapture)
I can see the preview, but it is not ok for me to see only preview without use cases
Solution 1:[1]
Currently, based on your camera hardware level, the device might not support certain UseCase(s) combinations with VideoCapture. So to make sure VideoCapture works, you have to disable ImageCapture and vice versa.
Solution 2:[2]
Right now the only solution which I had managed to find it to handle capture mode and set only one user during binding:
cameraProvider.bindToLifecycle(
this,
cameraSelector,
preview,
if (intent.extras?.getBoolean("is_video") == true) videoCapture else imageCapture
)
I don't sure whether it is ok, but I can't any more accurate solution :(
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Xi å¼ ç†¹ |
| Solution 2 | Andrew |
