@@ -22,6 +22,7 @@ import androidx.annotation.StringRes
22
22
import androidx.camera.camera2.interop.Camera2Interop
23
23
import androidx.camera.core.AspectRatio
24
24
import androidx.camera.core.Camera
25
+ import androidx.camera.core.CameraInfo
25
26
import androidx.camera.core.CameraSelector
26
27
import androidx.camera.core.ImageAnalysis
27
28
import androidx.camera.core.ImageCapture
@@ -223,6 +224,10 @@ class CamConfig(private val mActivity: MainActivity) {
223
224
224
225
var lastCapturedItem: CapturedItem ? = null
225
226
227
+ private var frontCameraInfo : CameraInfo ? = null
228
+
229
+ private var rearCameraInfo : CameraInfo ? = null
230
+
226
231
init {
227
232
if (mActivity !is SecureActivity ) {
228
233
CapturedItems .init (mActivity, this )
@@ -355,7 +360,7 @@ class CamConfig(private val mActivity: MainActivity) {
355
360
modePref.getString(videoFrameRateKey, " " )!!
356
361
)
357
362
} else {
358
- SettingValues . Default . VIDEO_FRAME_RATE
363
+ defaultVideoFrameRate
359
364
}
360
365
}
361
366
set(value) {
@@ -377,6 +382,15 @@ class CamConfig(private val mActivity: MainActivity) {
377
382
return " ${SettingValues .Key .VIDEO_FRAME_RATE } _$pf "
378
383
}
379
384
385
+ val defaultVideoFrameRate : Range <Int >
386
+ get() {
387
+ val availableFrameRates = getAvailableVideoFrameRates()
388
+ if (availableFrameRates.isEmpty() ||
389
+ availableFrameRates.contains(SettingValues .Default .VIDEO_FRAME_RATE ))
390
+ return SettingValues .Default .VIDEO_FRAME_RATE
391
+ return availableFrameRates[0 ]
392
+ }
393
+
380
394
var flashMode: Int
381
395
get() = if (imageCapture != null ) imageCapture!! .flashMode else
382
396
SettingValues .Default .FLASH_MODE
@@ -928,6 +942,18 @@ class CamConfig(private val mActivity: MainActivity) {
928
942
startCamera(true )
929
943
}
930
944
945
+ fun getCurrentCameraInfo () : CameraInfo {
946
+ return if (lensFacing == CameraSelector .LENS_FACING_BACK ) rearCameraInfo!!
947
+ else frontCameraInfo!!
948
+ }
949
+
950
+ fun getAvailableVideoFrameRates (): List <Range <Int >> {
951
+ val resSet = getCurrentCameraInfo().supportedFrameRateRanges
952
+ // Individual fps -> Ranged fps (sorted by lower value of range and then upper for each lower value)
953
+ val resList = resSet.sortedWith(compareBy<Range <Int >> { it.lower != it.upper }.thenBy { it.lower }.thenBy { it.upper })
954
+ return resList
955
+ }
956
+
931
957
fun toggleCameraSelector () {
932
958
933
959
// Manually switch to the opposite lens facing
@@ -971,6 +997,12 @@ class CamConfig(private val mActivity: MainActivity) {
971
997
return
972
998
}
973
999
1000
+ // Select a single camera for front/rear facing
1001
+ for (cameraInfo in cameraProvider!! .availableCameraInfos) {
1002
+ if (cameraInfo.lensFacing == CameraSelector .LENS_FACING_FRONT ) frontCameraInfo = cameraInfo
1003
+ else if (cameraInfo.lensFacing == CameraSelector .LENS_FACING_BACK ) rearCameraInfo = cameraInfo
1004
+ }
1005
+
974
1006
// Manually switch to the other lens facing (if the default lens facing isn't
975
1007
// supported for the current device)
976
1008
if (! isLensFacingSupported(lensFacing)) {
@@ -997,11 +1029,11 @@ class CamConfig(private val mActivity: MainActivity) {
997
1029
}
998
1030
999
1031
private fun isLensFacingSupported (lensFacing : Int ) : Boolean {
1000
- val tCameraSelector = CameraSelector . Builder ()
1001
- .requireLensFacing(lensFacing)
1002
- .build()
1003
-
1004
- return cameraProvider?.hasCamera(tCameraSelector) ? : false
1032
+ return when (lensFacing) {
1033
+ CameraSelector . LENS_FACING_FRONT -> frontCameraInfo != null
1034
+ CameraSelector . LENS_FACING_BACK -> rearCameraInfo != null
1035
+ else -> false
1036
+ }
1005
1037
}
1006
1038
1007
1039
// Start the camera with latest hard configuration
@@ -1026,7 +1058,15 @@ class CamConfig(private val mActivity: MainActivity) {
1026
1058
if (mActivity.isDestroyed || mActivity.isFinishing) return
1027
1059
1028
1060
cameraSelector = CameraSelector .Builder ()
1029
- .requireLensFacing(lensFacing)
1061
+ .addCameraFilter {
1062
+ return @addCameraFilter listOf (
1063
+ if (lensFacing == CameraSelector .LENS_FACING_BACK ) {
1064
+ rearCameraInfo
1065
+ } else {
1066
+ frontCameraInfo
1067
+ }
1068
+ )
1069
+ }
1030
1070
.build()
1031
1071
1032
1072
val builder = ImageCapture .Builder ()
0 commit comments