CameraView занимает около 2 секунд, чтобы сделать снимок - PullRequest
0 голосов
/ 27 октября 2019

Я использую CameraView из androidx компонентов, когда я использую метод takePicutre , для вызова требуется около 2 секундonImageSaved метод в ImageCapture.OnImageSavedListener слушатель, который заставляет пользователя чувствовать, что что-то не так.

вот мой код:

private fun takePicture() {
    Log.d("ThreadRunning", Thread.currentThread().name)
    val file = File(filesDir, UUID.randomUUID().toString())
    val executor = Executors.newSingleThreadExecutor()
    val startTime = System.currentTimeMillis()
    cameraView?.takePicture(file, executor,
            object : ImageCapture.OnImageSavedListener {
                override fun onError(
                        error: ImageCapture.ImageCaptureError,
                        message: String,
                        exc: Throwable?
                ) {
                    runOnUiThread {
                        captureButton.visibility = View.VISIBLE
                        cameraView.visibility = View.VISIBLE
                    }
                    Log.d("CaptureClicked", "{$message}")
                }

                override fun onImageSaved(file: File) {

                    val bmOptions = BitmapFactory.Options()
                    var bitmap = BitmapFactory.decodeFile(file.absolutePath, bmOptions)
                    val displayMetrics = DisplayMetrics()
                    windowManager?.defaultDisplay?.getMetrics(displayMetrics)
                    //val width = displayMetrics.widthPixels
                    //val height = displayMetrics.heightPixels
                    val width = cameraView.width
                    val height = cameraView.height
                    val numratorValue = (height.toDouble() / width.toDouble()).roundToInt()
                    bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true)
                    bitmap = if (cameraView.cameraLensFacing == CameraX.LensFacing.FRONT) {
                        bitmap.rotate(270F).mirror()
                    } else {
                        bitmap.rotate(90F)
                    }
                    runOnUiThread{
                        capturedImageView.setImageBitmap(bitmap)
                        capturedImageView.visibility = View.VISIBLE
                        cancelButton.visibility = View.VISIBLE
                        captureButton.visibility = View.INVISIBLE

                    }


                    Log.d("TestDelay", "${System.currentTimeMillis() - startTime}")
                }
            }
    )

}

private fun Bitmap.rotate(degrees: Float): Bitmap {
    val matrix = Matrix().apply {
        postRotate(degrees)
    }
    return Bitmap.createBitmap(this, 0, 0, width, height, matrix, true)
}

private fun Bitmap.mirror(): Bitmap {
    val matrix = Matrix().apply {
        preScale(-1F, 1F)
    }
    return Bitmap.createBitmap(this, 0, 0, width, height, matrix, true)
}

А вотэто элемент xml для cameraView

<androidx.camera.view.CameraView
    android:id="@+id/cameraView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:captureMode="image"/>

Еще один вопрос, когда я использую метод takePicture в Fragment , я получаю черный экран в течение 0,5 секунд, я думаю, из-заобъект lifecyclerOwner, но я не знаю, куда я должен поместить метод связывания, а где точно отсоединить его.

Итак, у меня есть два вопроса

1 - Почему просмотр камеры занимает слишком много времени, чтобысделать снимок и как уменьшить это время?

2 - Почему я получаю черный экран после вызова метода takePicutre при использовании Fragment ?

...