diff --git a/package/android/src/main/java/com/mrousavy/camera/CameraView.kt b/package/android/src/main/java/com/mrousavy/camera/CameraView.kt index 95ceb90..780664a 100644 --- a/package/android/src/main/java/com/mrousavy/camera/CameraView.kt +++ b/package/android/src/main/java/com/mrousavy/camera/CameraView.kt @@ -131,6 +131,10 @@ class CameraView(context: Context) : super.onDetachedFromWindow() } + fun destroy() { + cameraSession.close() + } + fun update() { Log.i(TAG, "Updating CameraSession...") diff --git a/package/android/src/main/java/com/mrousavy/camera/CameraViewManager.kt b/package/android/src/main/java/com/mrousavy/camera/CameraViewManager.kt index 6e06b4c..4bbc35a 100644 --- a/package/android/src/main/java/com/mrousavy/camera/CameraViewManager.kt +++ b/package/android/src/main/java/com/mrousavy/camera/CameraViewManager.kt @@ -31,6 +31,11 @@ class CameraViewManager : ViewGroupManager() { override fun getName(): String = TAG + override fun onDropViewInstance(view: CameraView) { + view.destroy() + super.onDropViewInstance(view) + } + @ReactProp(name = "cameraId") fun setCameraId(view: CameraView, cameraId: String) { view.cameraId = cameraId diff --git a/package/android/src/main/java/com/mrousavy/camera/core/CameraSession.kt b/package/android/src/main/java/com/mrousavy/camera/core/CameraSession.kt index 92c65a0..f432b52 100644 --- a/package/android/src/main/java/com/mrousavy/camera/core/CameraSession.kt +++ b/package/android/src/main/java/com/mrousavy/camera/core/CameraSession.kt @@ -172,6 +172,7 @@ class CameraSession(private val context: Context, private val cameraManager: Cam codeScannerOutput?.close() codeScannerOutput = null + configuration = null isRunning = false } @@ -363,16 +364,16 @@ class CameraSession(private val context: Context, private val cameraManager: Cam } private fun configureCaptureRequest(config: CameraConfiguration) { - val device = cameraDevice ?: throw NoCameraDeviceError() - val captureSession = captureSession ?: throw CameraNotReadyError() - if (!config.isActive) { // TODO: Do we want to do stopRepeating() or entirely destroy the session? // If the Camera is not active, we don't do anything. - captureSession.stopRepeating() + captureSession?.stopRepeating() return } + val device = cameraDevice ?: throw NoCameraDeviceError() + val captureSession = captureSession ?: throw CameraNotReadyError() + val previewOutput = previewOutput if (previewOutput == null) { Log.w(TAG, "Preview Output is null, aborting...")