Julian Steenbakker

feat: add available camera information in startcallback on android

... ... @@ -240,6 +240,7 @@ class MobileScanner(
cameraProviderFuture.addListener({
cameraProvider = cameraProviderFuture.get()
val nrOfCameras = cameraProvider?.availableCameraInfos?.size
if (cameraProvider == null) {
mobileScannerErrorCallback(CameraError())
... ... @@ -340,7 +341,8 @@ class MobileScanner(
if (portrait) width else height,
if (portrait) height else width,
camera?.cameraInfo?.hasFlashUnit() ?: false,
textureEntry!!.id()
textureEntry!!.id(),
nrOfCameras ?: 0
)
)
}, executor)
... ...
... ... @@ -178,7 +178,8 @@ class MobileScannerHandler(
result.success(mapOf(
"textureId" to it.id,
"size" to mapOf("width" to it.width, "height" to it.height),
"torchable" to it.hasFlashUnit
"torchable" to it.hasFlashUnit,
"nrOfCameras" to it.nrOfCameras
))
}
},
... ...
... ... @@ -4,5 +4,6 @@ class MobileScannerStartParameters(
val width: Double = 0.0,
val height: Double,
val hasFlashUnit: Boolean,
val id: Long
val id: Long,
val nrOfCameras: Int
)
\ No newline at end of file
... ...
... ... @@ -47,6 +47,8 @@ class _BarcodeScannerWithControllerState
}
}
int? nrOfCameras;
@override
Widget build(BuildContext context) {
return Scaffold(
... ... @@ -57,6 +59,12 @@ class _BarcodeScannerWithControllerState
return Stack(
children: [
MobileScanner(
onScannerStarted: (arguments) {
if (arguments?.nrOfCameras != null) {
nrOfCameras = arguments!.nrOfCameras;
setState(() {});
}
},
controller: controller,
errorBuilder: (context, error, child) {
return ScannerErrorWidget(error: error);
... ... @@ -146,7 +154,9 @@ class _BarcodeScannerWithControllerState
},
),
iconSize: 32.0,
onPressed: () => controller.switchCamera(),
onPressed: nrOfCameras != null && nrOfCameras! < 2
? null
: () => controller.switchCamera(),
),
IconButton(
color: Colors.white,
... ...
... ... @@ -225,12 +225,12 @@ class _MobileScannerState extends State<MobileScanner>
return Stack(
alignment: Alignment.center,
children: [
_scanner(value.size, value.webId, value.textureId),
_scanner(value.size, value.webId, value.textureId, value.nrOfCameras),
widget.overlay!,
],
);
} else {
return _scanner(value.size, value.webId, value.textureId);
return _scanner(value.size, value.webId, value.textureId, value.nrOfCameras);
}
},
);
... ... @@ -238,7 +238,7 @@ class _MobileScannerState extends State<MobileScanner>
);
}
Widget _scanner(Size size, String? webId, int? textureId) {
Widget _scanner(Size size, String? webId, int? textureId, int? nrOfCameras) {
return ClipRect(
child: LayoutBuilder(
builder: (_, constraints) {
... ...
... ... @@ -304,6 +304,7 @@ class MobileScannerController {
isStarting = false;
return startArguments.value = MobileScannerArguments(
nrOfCameras: startResult['nrOfCameras'] as int?,
size: size,
hasTorch: hasTorch,
textureId: kIsWeb ? null : startResult['textureId'] as int?,
... ...
... ... @@ -15,10 +15,15 @@ class MobileScannerArguments {
/// The texture id of the capture used internally if device is web.
final String? webId;
/// Indicates how many cameras are available.
/// Only available on Android
final int? nrOfCameras;
MobileScannerArguments({
required this.size,
required this.hasTorch,
this.textureId,
this.webId,
this.nrOfCameras
});
}
... ...