@@ -22,8 +22,10 @@ import android.util.Range
22
22
import android.util.Size
23
23
import android.view.Surface
24
24
import androidx.annotation.RequiresApi
25
+ import androidx.camera.camera2.interop.Camera2CameraControl
25
26
import androidx.camera.camera2.interop.Camera2CameraInfo
26
27
import androidx.camera.camera2.interop.Camera2Interop
28
+ import androidx.camera.camera2.interop.CaptureRequestOptions
27
29
import androidx.camera.core.*
28
30
import androidx.camera.lifecycle.ProcessCameraProvider
29
31
import androidx.core.app.ActivityCompat
@@ -112,33 +114,6 @@ class CameraService : LifecycleService(), MJpegFrameProvider {
112
114
return minFocalLength
113
115
}
114
116
115
- @SuppressLint(" UnsafeExperimentalUsageError" )
116
- private fun <T > setFpsAndAutofocus (builder : T ) where T : ExtendableBuilder<*>, T : Any {
117
- val ext: Camera2Interop .Extender <* > = Camera2Interop .Extender (builder)
118
- if (_cameraSettings .disableAF) {
119
- ext.setCaptureRequestOption(
120
- CaptureRequest .CONTROL_AF_MODE , CameraMetadata .CONTROL_AF_MODE_OFF )
121
- ext.setCaptureRequestOption(
122
- CaptureRequest .CONTROL_AF_TRIGGER , CameraMetadata .CONTROL_AF_TRIGGER_CANCEL )
123
- ext.setCaptureRequestOption(CaptureRequest .LENS_FOCUS_DISTANCE , 0f )
124
- } else if (_cameraSettings .manualAF) {
125
- ext.setCaptureRequestOption(
126
- CaptureRequest .CONTROL_AF_MODE , CameraMetadata .CONTROL_AF_MODE_OFF )
127
- ext.setCaptureRequestOption(
128
- CaptureRequest .LENS_FOCUS_DISTANCE , _cameraSettings .manualAFValue)
129
- }
130
- else {
131
- ext.setCaptureRequestOption(
132
- CaptureRequest .CONTROL_AF_MODE , CameraMetadata .CONTROL_AF_MODE_AUTO )
133
-
134
- }
135
-
136
- if (_fpsLimit > 0 ) {
137
- ext.setCaptureRequestOption(
138
- CaptureRequest .CONTROL_AE_TARGET_FPS_RANGE , Range <Int >(_fpsLimit , _fpsLimit ))
139
- }
140
- }
141
-
142
117
private val _cameraSelector by lazy {
143
118
CameraSelector .Builder ()
144
119
.apply {
@@ -150,24 +125,20 @@ class CameraService : LifecycleService(), MJpegFrameProvider {
150
125
.build()
151
126
}
152
127
153
- private var _cameraPreview : Preview ? = null
154
-
155
- private fun createCameraPreview (): Preview {
156
- val builder =
157
- Preview .Builder ()
158
- .setTargetResolution(
159
- Size .parseSize(_cameraSettings .selectedVideoResolution ? : " 1280x720" ))
160
- .setTargetRotation(getSettingsRotation())
161
-
162
- setFpsAndAutofocus(builder)
128
+ private val _cameraPreview by lazy {
129
+ val builder =
130
+ Preview .Builder ()
131
+ .setTargetResolution(
132
+ Size .parseSize(_cameraSettings .selectedVideoResolution ? : " 1280x720" ))
133
+ .setTargetRotation(getSettingsRotation())
163
134
164
- val ret = builder.build()
165
- _cameraBoundUseCases [ret] =
166
- CompletableInitState (
167
- InitState .NOT_INITIALIZED ,
168
- callback = ::torchControlCallback,
169
- unbindDelayMs = UNBIND_STREAM_DELAY_MS )
170
- return ret
135
+ val ret = builder.build()
136
+ _cameraBoundUseCases [ret] =
137
+ CompletableInitState (
138
+ InitState .NOT_INITIALIZED ,
139
+ callback = ::torchControlCallback,
140
+ unbindDelayMs = UNBIND_STREAM_DELAY_MS )
141
+ ret
171
142
}
172
143
173
144
private val _imageCapture by lazy {
@@ -196,8 +167,6 @@ class CameraService : LifecycleService(), MJpegFrameProvider {
196
167
.setTargetRotation(getSettingsRotation())
197
168
.setBackpressureStrategy(ImageAnalysis .STRATEGY_KEEP_ONLY_LATEST )
198
169
199
- setFpsAndAutofocus(builder)
200
-
201
170
val ret = builder.build()
202
171
_cameraBoundUseCases [ret] =
203
172
CompletableInitState (
@@ -419,27 +388,44 @@ class CameraService : LifecycleService(), MJpegFrameProvider {
419
388
@OnLifecycleEvent(Lifecycle .Event .ON_STOP )
420
389
fun onStop () {
421
390
_logger .log(this ) { " Preview has stopped" }
422
- _cameraPreview ?.apply {
423
- deinitUseCase(this )
424
- }
391
+ deinitUseCase(_cameraPreview )
425
392
lifecycleOwner.lifecycle.removeObserver(this )
426
393
}
427
394
})
428
395
}
429
396
430
- fun getPreview (): Preview ? {
431
- _cameraPreview ?.apply {
432
- if (_cameraBoundUseCases [this ]!! .refcnt > 0 ) {
433
- // Deinit camera's usecase if one exists
434
- deinitUseCase(this )
397
+ @SuppressLint(" UnsafeExperimentalUsageError" , " RestrictedApi" )
398
+ fun updateCameraParameters () {
399
+ getCameraControl()?.apply {
400
+ val control = Camera2CameraControl .from(this )
401
+ val ext = CaptureRequestOptions .Builder ()
402
+ if (_cameraSettings .disableAF) {
403
+ ext.setCaptureRequestOption(
404
+ CaptureRequest .CONTROL_AF_MODE , CameraMetadata .CONTROL_AF_MODE_OFF )
405
+ ext.setCaptureRequestOption(
406
+ CaptureRequest .CONTROL_AF_TRIGGER , CameraMetadata .CONTROL_AF_TRIGGER_CANCEL )
407
+ ext.setCaptureRequestOption(CaptureRequest .LENS_FOCUS_DISTANCE , 0f )
408
+ } else if (_cameraSettings .manualAF) {
409
+ ext.setCaptureRequestOption(
410
+ CaptureRequest .CONTROL_AF_MODE , CameraMetadata .CONTROL_AF_MODE_OFF )
411
+ ext.setCaptureRequestOption(
412
+ CaptureRequest .LENS_FOCUS_DISTANCE , _cameraSettings .manualAFValue)
413
+ }
414
+ else {
415
+ ext.setCaptureRequestOption(
416
+ CaptureRequest .CONTROL_AF_MODE , CameraMetadata .CONTROL_AF_MODE_AUTO )
435
417
}
436
- }
437
418
438
- if (_cameraPreview == null ) {
439
- _cameraPreview = createCameraPreview()
440
- }
419
+ if (_fpsLimit > 0 ) {
420
+ ext.setCaptureRequestOption(
421
+ CaptureRequest .CONTROL_AE_TARGET_FPS_RANGE , Range <Int >(_fpsLimit , _fpsLimit ))
422
+ }
441
423
442
- if (! initUseCase(_cameraPreview !! , block = true )) {
424
+ control.setCaptureRequestOptions(ext.build())
425
+ }
426
+ }
427
+ fun getPreview (): Preview ? {
428
+ if (! initUseCase(_cameraPreview , block = true )) {
443
429
return null
444
430
}
445
431
@@ -535,6 +521,7 @@ class CameraService : LifecycleService(), MJpegFrameProvider {
535
521
initState.cameraControl = camera?.cameraControl
536
522
initState.setState(InitState .INITIALIZED )
537
523
initState.minFocalLength = null
524
+ updateCameraParameters()
538
525
539
526
try {
540
527
val cameraInfo = camera?.cameraInfo!!
0 commit comments