Tuesday, 3 December 2019

Why doesn't CameraX.bindToLifecycle support three cases in 1.0.0-alpha05?

I'm learning CameraX API, and CameraXBasic is a office sample code.

The Code A is based CameraFragment.kt

I add videoCaptureConfig, and bind it to lifecycle using CameraX.bindToLifecycle(viewLifecycleOwner, preview, imageCapture,videoCapture).

But I get the following error, why?

java.lang.IllegalArgumentException: No supported surface combination is found for camera device - Id : 0. May be attempting to bind too many use cases.

Code A

@SuppressLint("RestrictedApi")
private fun bindCameraUseCases() {

    // Get screen metrics used to setup camera for full screen resolution
    val metrics = DisplayMetrics().also { viewFinder.display.getRealMetrics(it) }
    val screenAspectRatio = Rational(metrics.widthPixels, metrics.heightPixels)

    // Set up the view finder use case to display camera preview
    val viewFinderConfig = PreviewConfig.Builder().apply {
        setLensFacing(lensFacing)
        // We request aspect ratio but no resolution to let CameraX optimize our use cases
        setTargetAspectRatio(screenAspectRatio)
        // Set initial target rotation, we will have to call this again if rotation changes
        // during the lifecycle of this use case
        setTargetRotation(viewFinder.display.rotation)
    }.build()

    // Use the auto-fit preview builder to automatically handle size and orientation changes
    preview = AutoFitPreviewBuilder.build(viewFinderConfig, viewFinder)


    // Set up the capture use case to allow users to take photos
    val imageCaptureConfig = ImageCaptureConfig.Builder().apply {
        setLensFacing(lensFacing)
        setCaptureMode(ImageCapture.CaptureMode.MIN_LATENCY)
        // We request aspect ratio but no resolution to match preview config but letting
        // CameraX optimize for whatever specific resolution best fits requested capture mode
        setTargetAspectRatio(screenAspectRatio)
        // Set initial target rotation, we will have to call this again if rotation changes
        // during the lifecycle of this use case
        setTargetRotation(viewFinder.display.rotation)
    }.build()

    imageCapture = ImageCapture(imageCaptureConfig)


    // Create a configuration object for the video use case
    val videoCaptureConfig = VideoCaptureConfig.Builder().apply {
        setTargetRotation(viewFinder.display.rotation)
        setTargetAspectRatio(screenAspectRatio)
        setLensFacing(lensFacing)
    }.build()
    videoCapture = VideoCapture(videoCaptureConfig)


    CameraX.bindToLifecycle(viewLifecycleOwner, preview, imageCapture,videoCapture)
}


from Why doesn't CameraX.bindToLifecycle support three cases in 1.0.0-alpha05?

No comments:

Post a Comment