mirror of
https://github.com/openfoodfacts/smooth-app.git
synced 2025-08-26 03:01:45 +08:00
78 lines
2.3 KiB
Dart
78 lines
2.3 KiB
Dart
import 'package:camera/camera.dart';
|
|
import 'package:smooth_app/pages/scan/camera_controller.dart';
|
|
|
|
class CameraHelper {
|
|
const CameraHelper._();
|
|
|
|
static List<CameraDescription>? _cameras;
|
|
|
|
/// Ensure we have a single instance of this controller
|
|
/// /!\ Lazy-loaded
|
|
static SmoothCameraController? _controller;
|
|
|
|
/// Mandatory method to call before [findBestCamera]
|
|
static Future<void> init() async {
|
|
_cameras = await availableCameras();
|
|
}
|
|
|
|
/// Returns if the device has at least one camera
|
|
static bool get hasACamera {
|
|
if (_cameras == null) {
|
|
throw Exception('Please call [init] before!');
|
|
} else {
|
|
return _cameras!.isNotEmpty;
|
|
}
|
|
}
|
|
|
|
/// Find the most relevant camera to use if none of these criteria are met,
|
|
/// the default value of [_cameraIndex] will be used to select the first
|
|
/// camera in the global cameras list.
|
|
/// if non matching is found we fall back to the first in the list
|
|
/// initValue of [_cameraIndex]/
|
|
static CameraDescription? findBestCamera({
|
|
CameraLensDirection cameraLensDirection = CameraLensDirection.back,
|
|
}) {
|
|
if (_cameras == null) {
|
|
throw Exception('Please call [init] before!');
|
|
} else if (_cameras!.isEmpty) {
|
|
return null;
|
|
}
|
|
|
|
int cameraIndex = -1;
|
|
|
|
if (_cameras!.any(
|
|
(CameraDescription element) =>
|
|
element.lensDirection == cameraLensDirection &&
|
|
element.sensorOrientation == 90,
|
|
)) {
|
|
cameraIndex = _cameras!.indexOf(
|
|
_cameras!.firstWhere((CameraDescription element) =>
|
|
element.lensDirection == cameraLensDirection &&
|
|
element.sensorOrientation == 90),
|
|
);
|
|
} else if (_cameras!.any((CameraDescription element) =>
|
|
element.lensDirection == cameraLensDirection)) {
|
|
cameraIndex = _cameras!.indexOf(
|
|
_cameras!.firstWhere(
|
|
(CameraDescription element) =>
|
|
element.lensDirection == cameraLensDirection,
|
|
),
|
|
);
|
|
}
|
|
|
|
return _cameras![cameraIndex];
|
|
}
|
|
|
|
/// Init the controller
|
|
/// And prevents the redefinition of it
|
|
static void initController(SmoothCameraController controller) {
|
|
_controller ??= controller;
|
|
}
|
|
|
|
static void destroyControllerInstance() {
|
|
_controller = null;
|
|
}
|
|
|
|
static SmoothCameraController? get controller => _controller;
|
|
}
|