james04
james04

Reputation: 1920

ImageCapture cameraX orientation detect when is locked

I want to capture an Image and a Video using the CameraX library. By following the documentation i have no problem implementing the preview and the capture use cases. The code i use is the following.

    private fun startCamera() {
        cameraProviderFuture = ProcessCameraProvider.getInstance(this)
        cameraProviderFuture.addListener({ setUpCamera() }, cameraExecutor)
    }

    private fun setUpCamera() {
        cameraProvider = cameraProviderFuture.get()
        bindPreview()
    }

    private fun bindPreview() {
        preview = Preview.Builder().build().also {
            it.setSurfaceProvider(binding.cameraPreview.surfaceProvider)
        }

        imageCapture = ImageCapture.Builder()
            .setFlashMode(flashMode)
            .setCaptureMode(CAPTURE_MODE_MAXIMIZE_QUALITY)
            .build()

        videoCapture = ...

        bindCamera()
    }

    private fun bindCamera() {
        cameraSelector = selectExternalOrBestCamera()
        cameraProvider.unbindAll()
        camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture, videoCapture)

Now, let's say that i have locked my device orientation from the menu panel. So if i rotate de device, the applications do not rotate at all. In that case, if a capture an Image, the captured image which i save and i want to send to a Server is rotated by 90 degrees,, which is reasonable since i rotated the device and capture a photo. As i can see, in other applications (like Whatsapp) the same senario does not happen since they show the preview image correctly rotated after the capture. How can i solve that issue?

Upvotes: 0

Views: 106

Answers (1)

james04
james04

Reputation: 1920

So finally i found the solution.

val rotation = display?.rotation ?: Surface.ROTATION_0
        val isLandscape = rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270
        imageCapture = ImageCapture.Builder()
            .setFlashMode(flashMode)
            .setCaptureMode(CAPTURE_MODE_MAXIMIZE_QUALITY)
            .setTargetRotation(rotation)
            .setTargetResolution(
                if (isLandscape)
                    Size(1920, 1080)
                else
                    Size(1080, 1920)
            )
            .build()

That gives me the preview image that i capture in the desired orientation

Upvotes: 0

Related Questions