Android camera2 - изменить соотношение во время предварительного просмотра - PullRequest
0 голосов
/ 08 октября 2019

Я использую Camera2 API в моем приложении для Android. У меня проблема с изменением коэффициента во время предварительного просмотра. Он работает, когда я вызывал SurfaceTextureListener метод onSurfaceTextureAvailable, но работает очень медленно. Я хотел бы ускорить это. Вот почему я использовал приведенный ниже код.

        ratio.setOnClickListener {
            window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
            if (targetRatio == 177) {
                targetRatio = 133
                ratio.text = getString(R.string.ratio_4_3)
            }
            else if (targetRatio == 133) {
                targetRatio = 177
                ratio.text = getString(R.string.ratio_16_9)
            }

            val height = camera_view.height
            val width = camera_view.width

            val swappedDimensions = areDimensionsSwapped(rotation!!)

            val rotatedPreviewWidth = if (swappedDimensions) height else width
            val rotatedPreviewHeight = if (swappedDimensions) width else height

            previewSize = chooseOptimalSize(map!!.getOutputSizes(SurfaceTexture::class.java),
                rotatedPreviewWidth, rotatedPreviewHeight)

            transformImage(previewSize!!.width, previewSize!!.height)

            reader = ImageReader.newInstance(previewSize!!.width, previewSize!!.height, ImageFormat.JPEG, 2).apply {
                setOnImageAvailableListener(mOnImageAvailableListener, backgroundHandler)
            }
            createCameraPreview()

            window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
    }

И метод createCameraPreview:

private fun createCameraPreview() {
    try {
        val texture = camera_view.surfaceTexture!!
        texture.setDefaultBufferSize(previewSize!!.width, previewSize!!.height)
        surface = Surface(texture)
        captureRequestBuilder = cameraDevice!!.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)
        captureRequestBuilder!!.addTarget(surface)
        cameraDevice!!.createCaptureSession(listOf(surface, reader?.surface), object : CameraCaptureSession.StateCallback() {
            override fun onConfigureFailed(session: CameraCaptureSession) { }

            override fun onConfigured(@NonNull cameraCaptureSession: CameraCaptureSession) {
                if (null == cameraDevice) {
                    return
                }
                cameraCaptureSessions = cameraCaptureSession
                updatePreview()
            }
        }, null)
    } catch (e: CameraAccessException) {
        e.printStackTrace()
    }
}

private fun updatePreview() {
    captureRequestBuilder!!.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)
    getFlashMode(captureRequestBuilder!!)
    try {
        mPreviewRequest = captureRequestBuilder!!.build()
        cameraCaptureSessions!!.setRepeatingRequest(captureRequestBuilder!!.build(), mCaptureCallback, backgroundHandler)
        this@CameraActivity.runOnUiThread { window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE) }
    } catch (e: CameraAccessException) {
        e.printStackTrace()
    }

}

Когда я меняю разрешение, мой предварительный просмотр обновляется, но когда я делаю снимок, моя фотография имеетстарое разрешение (до изменения). Я уже пытался во многих отношениях, и я понятия не имею, почему это происходит. Кто-нибудь может мне помочь с моей проблемой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...