recreate the preview session after capturing a photo without focus
This commit is contained in:
parent
9696db4ef4
commit
1ec2c68961
|
@ -561,8 +561,12 @@ class PreviewCameraTwo : ViewGroup, TextureView.SurfaceTextureListener, MyPrevie
|
||||||
|
|
||||||
val captureCallback = object : CameraCaptureSession.CaptureCallback() {
|
val captureCallback = object : CameraCaptureSession.CaptureCallback() {
|
||||||
override fun onCaptureCompleted(session: CameraCaptureSession, request: CaptureRequest, result: TotalCaptureResult) {
|
override fun onCaptureCompleted(session: CameraCaptureSession, request: CaptureRequest, result: TotalCaptureResult) {
|
||||||
unlockFocus()
|
|
||||||
mActivity.toggleBottomButtons(false)
|
mActivity.toggleBottomButtons(false)
|
||||||
|
if (shouldLockFocus()) {
|
||||||
|
unlockFocus()
|
||||||
|
} else {
|
||||||
|
resetPreviewSession()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCaptureFailed(session: CameraCaptureSession?, request: CaptureRequest?, failure: CaptureFailure?) {
|
override fun onCaptureFailed(session: CameraCaptureSession?, request: CaptureRequest?, failure: CaptureFailure?) {
|
||||||
|
@ -680,6 +684,47 @@ class PreviewCameraTwo : ViewGroup, TextureView.SurfaceTextureListener, MyPrevie
|
||||||
return FocusArea(rect, MeteringRectangle.METERING_WEIGHT_MAX)
|
return FocusArea(rect, MeteringRectangle.METERING_WEIGHT_MAX)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// touch-to-focus stucks after capturing a photo without "Focus before capture" so just reset the whole session until fixed properly
|
||||||
|
private fun resetPreviewSession() {
|
||||||
|
val stateCallback = object : CameraCaptureSession.StateCallback() {
|
||||||
|
override fun onConfigured(cameraCaptureSession: CameraCaptureSession) {
|
||||||
|
if (mCameraDevice == null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
mCaptureSession = cameraCaptureSession
|
||||||
|
try {
|
||||||
|
mPreviewRequestBuilder!!.apply {
|
||||||
|
set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)
|
||||||
|
setFlashAndExposure(this)
|
||||||
|
mPreviewRequest = build()
|
||||||
|
}
|
||||||
|
mCaptureSession!!.setRepeatingRequest(mPreviewRequest, mCaptureCallback, mBackgroundHandler)
|
||||||
|
mCameraState = STATE_PREVIEW
|
||||||
|
|
||||||
|
Handler().postDelayed({
|
||||||
|
if (mLastFocusX != 0f && mLastFocusY != 0f) {
|
||||||
|
focusArea(mLastFocusX, mLastFocusY, false)
|
||||||
|
}
|
||||||
|
}, 200L)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onConfigureFailed(cameraCaptureSession: CameraCaptureSession) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
closeCaptureSession()
|
||||||
|
val texture = mTextureView.surfaceTexture!!
|
||||||
|
texture.setDefaultBufferSize(mPreviewSize!!.width, mPreviewSize!!.height)
|
||||||
|
|
||||||
|
val surface = Surface(texture)
|
||||||
|
mCameraDevice!!.createCaptureSession(Arrays.asList(surface, mImageReader!!.surface), stateCallback, null)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun calculateCameraToPreviewMatrix() {
|
private fun calculateCameraToPreviewMatrix() {
|
||||||
val yScale = if (mUseFrontCamera) -1 else 1
|
val yScale = if (mUseFrontCamera) -1 else 1
|
||||||
mCameraToPreviewMatrix.apply {
|
mCameraToPreviewMatrix.apply {
|
||||||
|
@ -822,6 +867,8 @@ class PreviewCameraTwo : ViewGroup, TextureView.SurfaceTextureListener, MyPrevie
|
||||||
it.width <= MAX_VIDEO_WIDTH && it.height <= MAX_VIDEO_HEIGHT
|
it.width <= MAX_VIDEO_WIDTH && it.height <= MAX_VIDEO_HEIGHT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun shouldLockFocus() = mIsFocusSupported && mActivity.config.focusBeforeCapture
|
||||||
|
|
||||||
override fun setTargetUri(uri: Uri) {
|
override fun setTargetUri(uri: Uri) {
|
||||||
mTargetUri = uri
|
mTargetUri = uri
|
||||||
}
|
}
|
||||||
|
@ -869,7 +916,7 @@ class PreviewCameraTwo : ViewGroup, TextureView.SurfaceTextureListener, MyPrevie
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mIsFocusSupported && mActivity.config.focusBeforeCapture) {
|
if (shouldLockFocus()) {
|
||||||
lockFocus()
|
lockFocus()
|
||||||
} else {
|
} else {
|
||||||
captureStillPicture()
|
captureStillPicture()
|
||||||
|
|
Loading…
Reference in New Issue