@@ -24,7 +24,9 @@ import android.view.MotionEvent
2424import android.view.Surface
2525import android.view.View
2626import androidx.annotation.OptIn
27+ import androidx.camera.camera2.interop.ExperimentalCamera2Interop
2728import androidx.camera.core.Camera
29+ import androidx.camera.core.CameraInfo
2830import androidx.camera.core.CameraSelector
2931import androidx.camera.core.ExperimentalGetImage
3032import 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