Skip to content

Commit 4ecc833

Browse files
authored
Merge pull request #1910 from pedroSG94/feature/camera2-callback-availability
add camera2 callback availability
2 parents 78d0a7c + da8b29a commit 4ecc833

2 files changed

Lines changed: 31 additions & 1 deletion

File tree

encoder/src/main/java/com/pedro/encoder/input/sources/video/Camera2Source.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package com.pedro.encoder.input.sources.video
1919
import android.content.Context
2020
import android.graphics.SurfaceTexture
2121
import android.hardware.camera2.CameraCharacteristics
22+
import android.hardware.camera2.CameraManager
2223
import android.os.Build
2324
import android.util.Range
2425
import android.util.Size
@@ -269,4 +270,22 @@ class Camera2Source(context: Context): VideoSource() {
269270
size?.let { checkResolutionSupported(it.width, it.height) }
270271
camera.setRequiredResolution(size)
271272
}
273+
274+
/**
275+
* Add a callback to detect the camera availability.
276+
* Set null value to remove the callback
277+
*/
278+
fun setAvailabilityCallback(callback: CameraManager.AvailabilityCallback?) {
279+
camera.setAvailabilityCallback(callback)
280+
}
281+
282+
/**
283+
* Re start camera if possible, return true or false depend if can do it or not.
284+
*/
285+
fun restart(): Boolean {
286+
if (isRunning()) camera.reOpenCamera(camera.getCurrentCameraId())
287+
else if (camera.isPrepared) camera.openCameraId(camera.getCurrentCameraId())
288+
else return false
289+
return true
290+
}
272291
}

encoder/src/main/java/com/pedro/encoder/input/video/Camera2ApiManager.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
7777
private val cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
7878
private var cameraHandler: Handler? = null
7979
private var cameraCaptureSession: CameraCaptureSession? = null
80-
private var isPrepared: Boolean = false
80+
var isPrepared: Boolean = false
81+
private set
8182
private var cameraId: String = "0"
8283
private var physicalCameraId: String? = null
8384
private var facing = Facing.BACK
@@ -114,6 +115,7 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
114115
private var faceDetectionEnabled = false
115116
private var faceDetectionMode = 0
116117
private var imageReader: ImageReader? = null
118+
private var availabilityCallback: CameraManager.AvailabilityCallback? = null
117119

118120
init {
119121
cameraId = try { getCameraIdForFacing(Facing.BACK) } catch (_: Exception) { "0" }
@@ -239,6 +241,15 @@ class Camera2ApiManager(context: Context) : CameraDevice.StateCallback() {
239241
this.cameraId = cameraId
240242
}
241243

244+
fun setAvailabilityCallback(callback: CameraManager.AvailabilityCallback?) {
245+
if (callback == null) {
246+
availabilityCallback?.let { cameraManager.unregisterAvailabilityCallback(it) }
247+
} else {
248+
cameraManager.registerAvailabilityCallback(callback, null)
249+
availabilityCallback = callback
250+
}
251+
}
252+
242253
var cameraFacing: Facing
243254
get() = facing
244255
set(cameraFacing) {

0 commit comments

Comments
 (0)