fix: Avoid "CameraNotReady" errors when updating props in background (#2382)
This commit is contained in:
parent
9ecc09cfe4
commit
a4686022e2
@ -163,24 +163,39 @@ class CameraSession(private val context: Context, private val cameraManager: Cam
|
|||||||
Log.i(TAG, "configure { ... }: Updating CameraSession Configuration... $diff")
|
Log.i(TAG, "configure { ... }: Updating CameraSession Configuration... $diff")
|
||||||
|
|
||||||
try {
|
try {
|
||||||
val needsRebuild = config.isActive && (cameraDevice == null || captureSession == null)
|
val needsRebuild = cameraDevice == null || captureSession == null
|
||||||
if (needsRebuild) {
|
if (needsRebuild) {
|
||||||
Log.i(TAG, "Need to rebuild CameraDevice and CameraCaptureSession...")
|
Log.i(TAG, "Need to rebuild CameraDevice and CameraCaptureSession...")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Since cameraDevice and captureSession are OS resources, we have three possible paths here:
|
||||||
|
if (needsRebuild) {
|
||||||
|
if (config.isActive) {
|
||||||
|
// A: The Camera has been torn down by the OS and we want it to be active - rebuild everything
|
||||||
|
Log.i(TAG, "Need to rebuild CameraDevice and CameraCaptureSession...")
|
||||||
|
configureCameraDevice(config)
|
||||||
|
configureOutputs(config)
|
||||||
|
configureCaptureRequest(config)
|
||||||
|
} else {
|
||||||
|
// B: The Camera has been torn down by the OS but it's currently in the background - ignore this
|
||||||
|
Log.i(TAG, "CameraDevice and CameraCaptureSession is torn down but Camera is not active, skipping update...")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// C: The Camera has not been torn down and we just want to update some props - update incrementally
|
||||||
// Build up session or update any props
|
// Build up session or update any props
|
||||||
if (diff.deviceChanged || needsRebuild) {
|
if (diff.deviceChanged) {
|
||||||
// 1. cameraId changed, open device
|
// 1. cameraId changed, open device
|
||||||
configureCameraDevice(config)
|
configureCameraDevice(config)
|
||||||
}
|
}
|
||||||
if (diff.outputsChanged || needsRebuild) {
|
if (diff.outputsChanged) {
|
||||||
// 2. outputs changed, build new session
|
// 2. outputs changed, build new session
|
||||||
configureOutputs(config)
|
configureOutputs(config)
|
||||||
}
|
}
|
||||||
if (diff.sidePropsChanged || needsRebuild) {
|
if (diff.sidePropsChanged) {
|
||||||
// 3. zoom etc changed, update repeating request
|
// 3. zoom etc changed, update repeating request
|
||||||
configureCaptureRequest(config)
|
configureCaptureRequest(config)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Log.i(TAG, "Successfully updated CameraSession Configuration! isActive: ${config.isActive}")
|
Log.i(TAG, "Successfully updated CameraSession Configuration! isActive: ${config.isActive}")
|
||||||
this.configuration = config
|
this.configuration = config
|
||||||
|
Loading…
Reference in New Issue
Block a user