CameraX вращение изображения с фиксированной ориентацией экрана - PullRequest
0 голосов
/ 12 апреля 2020

Я добавил cameraX в свое приложение, как описано в этом руководстве . Единственная проблема, с которой я столкнулся - это поворот изображения. В файле манифеста приложения я использую эти настройки для активности камеры android:screenOrientation="portrait". Моя цель - сделать это упражнение всегда в портретном режиме, в то время как захваченные изображения должны иметь реальное вращение.

Как мне этого добиться? Возможно ли, что CameraX обнаружит различное вращение, когда активность зафиксирована?

Это мой код в деятельности камеры

private lateinit var cameraProviderFuture: ListenableFuture<ProcessCameraProvider>
private lateinit var imageCapture: ImageCapture
private val executor = Executors.newSingleThreadExecutor()
private var camera: Camera? = null
...
override fun onCreate(savedInstanceState: Bundle?)
{
    ...
    cameraProviderFuture = ProcessCameraProvider.getInstance(this)
    preview_view.post(
        {
            startCamera()
        })
}
...
fun startCamera()
{
    preview = Preview.Builder().apply {
        setTargetAspectRatio(AspectRatio.RATIO_16_9)
        setTargetRotation(preview_view.display.rotation)
    }.build()

    imageCapture = ImageCapture.Builder().apply {
        setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
    }.build()

    val cameraSelector = CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build()
    cameraProviderFuture.addListener(Runnable {
        val cameraProvider = cameraProviderFuture.get()
        cameraProvider.unbindAll()
        camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture)
        preview.setSurfaceProvider(preview_view.createSurfaceProvider(camera!!.cameraInfo))
    }, ContextCompat.getMainExecutor(this))
}
...
fun takePicture()
{
    val file = createFile(getOutputDirectory(), FILENAME, PHOTO_EXTENSION)
    val outputFileOptions = ImageCapture.OutputFileOptions.Builder(file).build()

    imageCapture.takePicture(outputFileOptions, executor, object : ImageCapture.OnImageSavedCallback
    {
        override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults)
        {
            val my_file_item = MyFileItem.createFromFile(file)
            imageCaptured(my_file_item)
        }

        override fun onError(exception: ImageCaptureException)
        {
            val msg = "Photo capture failed: ${exception.message}"
            preview_view.post({
                Toast.makeText(this@ActPhotoCapture2, msg, Toast.LENGTH_LONG).show()
            })
        }
    })
}

1 Ответ

2 голосов
/ 13 апреля 2020

Если ваша ориентация заблокирована, вы, вероятно, можете использовать прослушиватель ориентации для прослушивания изменений в ориентации устройства, и каждый раз, когда вызывается его обратный вызов onOrientationChanged, вы устанавливаете целевое вращение для случая использования захвата изображения.

val orientationEventListener = object : OrientationEventListener(context) {
    override fun onOrientationChanged(orientation: Int) {
        imageCapture.targetRotation = view.display.rotation
    }
}

Представлением, используемым для поворота, может быть любое представление, например, представление root, если вы находитесь во фрагменте, или только представление предварительного просмотра. Вы также можете включить / отключить этот прослушиватель в onResume и onPause.

ps: способ настройки вариантов использования может вызвать проблемы. Варианты использования не должны быть инициализированы до запуска камеры. Вы должны построить варианты использования после этой строки val cameraProvider = cameraProviderFuture.get().

...