Skip to content

Commit 1af26b2

Browse files
authored
Merge pull request #1967 from sw-orjan/camerax-opencamera
Added support to open specific camera in CameraXSource
2 parents 4668b29 + d6d740e commit 1af26b2

File tree

1 file changed

+31
-20
lines changed

1 file changed

+31
-20
lines changed

extra-sources/src/main/java/com/pedro/extrasources/CameraXSource.kt

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ import android.view.MotionEvent
2424
import android.view.Surface
2525
import android.view.View
2626
import androidx.annotation.OptIn
27+
import androidx.camera.camera2.interop.ExperimentalCamera2Interop
2728
import androidx.camera.core.Camera
29+
import androidx.camera.core.CameraInfo
2830
import androidx.camera.core.CameraSelector
2931
import androidx.camera.core.ExperimentalGetImage
3032
import androidx.camera.core.FocusMeteringAction
@@ -60,6 +62,7 @@ class CameraXSource(
6062
private var camera: Camera? = null
6163
private var preview = Preview.Builder().build()
6264
private var facing = CameraSelector.LENS_FACING_BACK
65+
private var cameraSelectorBuilder: CameraSelector.Builder = CameraSelector.Builder()
6366
private var surface: Surface? = null
6467
private var autoFocusEnabled = false
6568
private var autoExposureEnabled = false
@@ -94,24 +97,17 @@ class CameraXSource(
9497
surfaceTexture.setDefaultBufferSize(optimalResolution.width, optimalResolution.height)
9598
this.surfaceTexture = surfaceTexture
9699
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)
97-
cameraProviderFuture.addListener({
98-
try {
99-
val cameraSelector = CameraSelector.Builder()
100-
.requireLensFacing(this.facing)
101-
.build()
102-
103-
preview.setSurfaceProvider {
104-
val surface = Surface(surfaceTexture)
105-
it.provideSurface(surface, Executors.newSingleThreadExecutor()) {
106-
}
107-
this.surface = surface
108-
}
109-
camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview)
110-
} catch (e: ExecutionException) {
111-
// No errors need to be handled for this Future.
112-
// This should never be reached.
113-
} catch (ignored: InterruptedException) { }
114-
}, ContextCompat.getMainExecutor(context))
100+
val cameraSelector = cameraSelectorBuilder
101+
.requireLensFacing(this.facing)
102+
.build()
103+
104+
preview.setSurfaceProvider {
105+
val surface = Surface(surfaceTexture)
106+
it.provideSurface(surface, Executors.newSingleThreadExecutor()) {
107+
}
108+
this.surface = surface
109+
}
110+
camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview)
115111
}
116112

117113
override fun stop() {
@@ -134,10 +130,25 @@ class CameraXSource(
134130
surfaceTexture?.let {
135131
stop()
136132
facing = if (facing == CameraSelector.LENS_FACING_BACK) CameraSelector.LENS_FACING_FRONT else CameraSelector.LENS_FACING_BACK
133+
cameraSelectorBuilder = CameraSelector.Builder()
137134
start(it)
138135
}
139136
}
140137

138+
@OptIn(ExperimentalCamera2Interop::class)
139+
fun openCamera(info: CameraInfo) {
140+
surfaceTexture?.let { surface ->
141+
stop()
142+
facing = info.lensFacing
143+
cameraSelectorBuilder = CameraSelector.Builder().apply {
144+
addCameraFilter { cameras ->
145+
cameras.filter { it == info }
146+
}
147+
}
148+
start(surface)
149+
}
150+
}
151+
141152
fun getCameraFacing() = facing
142153

143154
fun getCameraResolutions(facing: CameraHelper.Facing): List<Size> {
@@ -287,7 +298,7 @@ class CameraXSource(
287298
.setBackpressureStrategy(ImageAnalysis.STRATEGY_BLOCK_PRODUCER)
288299
.setOutputImageFormat(format)
289300
.build()
290-
val cameraSelector = CameraSelector.Builder()
301+
val cameraSelector = cameraSelectorBuilder
291302
.requireLensFacing(this.facing)
292303
.build()
293304
cameraProvider.unbindAll()
@@ -302,7 +313,7 @@ class CameraXSource(
302313

303314
fun removeImageListener() {
304315
cameraProvider.unbindAll()
305-
val cameraSelector = CameraSelector.Builder()
316+
val cameraSelector = cameraSelectorBuilder
306317
.requireLensFacing(this.facing)
307318
.build()
308319
camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview)

0 commit comments

Comments
 (0)