fix: Close CameraSession if the View is removed (#2174)

* fix: Close `CameraSession` if the View is removed

* fix: Use ViewManager's `onDropViewInstance` instead

* fix: Only stop repeating if we have a session

* fix: Reset `configuration` on `close()`
This commit is contained in:
Marc Rousavy 2023-11-18 14:58:07 +01:00 committed by GitHub
parent 98a641702c
commit a7e706150e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 14 additions and 4 deletions

View File

@ -131,6 +131,10 @@ class CameraView(context: Context) :
super.onDetachedFromWindow() super.onDetachedFromWindow()
} }
fun destroy() {
cameraSession.close()
}
fun update() { fun update() {
Log.i(TAG, "Updating CameraSession...") Log.i(TAG, "Updating CameraSession...")

View File

@ -31,6 +31,11 @@ class CameraViewManager : ViewGroupManager<CameraView>() {
override fun getName(): String = TAG override fun getName(): String = TAG
override fun onDropViewInstance(view: CameraView) {
view.destroy()
super.onDropViewInstance(view)
}
@ReactProp(name = "cameraId") @ReactProp(name = "cameraId")
fun setCameraId(view: CameraView, cameraId: String) { fun setCameraId(view: CameraView, cameraId: String) {
view.cameraId = cameraId view.cameraId = cameraId

View File

@ -172,6 +172,7 @@ class CameraSession(private val context: Context, private val cameraManager: Cam
codeScannerOutput?.close() codeScannerOutput?.close()
codeScannerOutput = null codeScannerOutput = null
configuration = null
isRunning = false isRunning = false
} }
@ -363,16 +364,16 @@ class CameraSession(private val context: Context, private val cameraManager: Cam
} }
private fun configureCaptureRequest(config: CameraConfiguration) { private fun configureCaptureRequest(config: CameraConfiguration) {
val device = cameraDevice ?: throw NoCameraDeviceError()
val captureSession = captureSession ?: throw CameraNotReadyError()
if (!config.isActive) { if (!config.isActive) {
// TODO: Do we want to do stopRepeating() or entirely destroy the session? // TODO: Do we want to do stopRepeating() or entirely destroy the session?
// If the Camera is not active, we don't do anything. // If the Camera is not active, we don't do anything.
captureSession.stopRepeating() captureSession?.stopRepeating()
return return
} }
val device = cameraDevice ?: throw NoCameraDeviceError()
val captureSession = captureSession ?: throw CameraNotReadyError()
val previewOutput = previewOutput val previewOutput = previewOutput
if (previewOutput == null) { if (previewOutput == null) {
Log.w(TAG, "Preview Output is null, aborting...") Log.w(TAG, "Preview Output is null, aborting...")