diff --git a/encoder/src/main/java/com/pedro/encoder/input/sources/video/Camera2Source.kt b/encoder/src/main/java/com/pedro/encoder/input/sources/video/Camera2Source.kt index bb1baf755..f6ba70cd7 100644 --- a/encoder/src/main/java/com/pedro/encoder/input/sources/video/Camera2Source.kt +++ b/encoder/src/main/java/com/pedro/encoder/input/sources/video/Camera2Source.kt @@ -19,6 +19,7 @@ package com.pedro.encoder.input.sources.video import android.content.Context import android.graphics.SurfaceTexture import android.hardware.camera2.CameraCharacteristics +import android.hardware.camera2.CameraManager import android.os.Build import android.util.Range import android.util.Size @@ -269,4 +270,22 @@ class Camera2Source(context: Context): VideoSource() { size?.let { checkResolutionSupported(it.width, it.height) } camera.setRequiredResolution(size) } + + /** + * Add a callback to detect the camera availability. + * Set null value to remove the callback + */ + fun setAvailabilityCallback(callback: CameraManager.AvailabilityCallback?) { + camera.setAvailabilityCallback(callback) + } + + /** + * Re start camera if possible, return true or false depend if can do it or not. + */ + fun restart(): Boolean { + if (isRunning()) camera.reOpenCamera(camera.getCurrentCameraId()) + else if (camera.isPrepared) camera.openCameraId(camera.getCurrentCameraId()) + else return false + return true + } } \ No newline at end of file diff --git a/encoder/src/main/java/com/pedro/encoder/input/video/Camera2ApiManager.kt b/encoder/src/main/java/com/pedro/encoder/input/video/Camera2ApiManager.kt index 5d1c2f1f9..5993f525c 100644 --- a/encoder/src/main/java/com/pedro/encoder/input/video/Camera2ApiManager.kt +++ b/encoder/src/main/java/com/pedro/encoder/input/video/Camera2ApiManager.kt @@ -77,7 +77,8 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() { private val cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager private var cameraHandler: Handler? = null private var cameraCaptureSession: CameraCaptureSession? = null - private var isPrepared: Boolean = false + var isPrepared: Boolean = false + private set private var cameraId: String = "0" private var physicalCameraId: String? = null private var facing = Facing.BACK @@ -114,6 +115,7 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() { private var faceDetectionEnabled = false private var faceDetectionMode = 0 private var imageReader: ImageReader? = null + private var availabilityCallback: CameraManager.AvailabilityCallback? = null init { cameraId = try { getCameraIdForFacing(Facing.BACK) } catch (_: Exception) { "0" } @@ -239,6 +241,15 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() { this.cameraId = cameraId } + fun setAvailabilityCallback(callback: CameraManager.AvailabilityCallback?) { + if (callback == null) { + availabilityCallback?.let { cameraManager.unregisterAvailabilityCallback(it) } + } else { + cameraManager.registerAvailabilityCallback(callback, null) + availabilityCallback = callback + } + } + var cameraFacing: Facing get() = facing set(cameraFacing) {