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