You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
diplomatic-quarter/packages/vital_sign_camera/lib/src/query_camera_device.dart

64 lines
2.0 KiB
Dart

import 'camera_device.dart';
import 'camera_device_type.dart';
import 'camera_position.dart';
import 'vital_sign_camera.dart';
/// Queries the best available [CameraDevice] with [CameraDeviceType].
Future<Map<CameraPosition, CameraDevice?>> queryCameraDevices(
CameraDeviceType type) async {
final devices = await availableCameraDevices();
final result = devices.where((element) {
if (element.devices.length == 1) {
return element.devices[0] == type;
}
final hasWide = element.devices.contains(CameraDeviceType.wideAngleCamera);
final hasUltra =
element.devices.contains(CameraDeviceType.ultraWideAngleCamera);
final hasTele = element.devices.contains(CameraDeviceType.telephotoCamera);
if (hasTele &&
hasWide &&
hasUltra &&
type == CameraDeviceType.tripleCamera) {
return true;
}
if (hasWide && hasUltra && type == CameraDeviceType.dualWideCamera) {
return true;
}
if (hasWide && hasTele && type == CameraDeviceType.dualCamera) {
return true;
}
return false;
});
CameraDevice? deviceWithPosition(CameraPosition position) {
final list = result.where((element) => element.position == position);
return list.isNotEmpty ? list.first : null;
}
return <CameraPosition, CameraDevice?>{
CameraPosition.back: deviceWithPosition(CameraPosition.back),
CameraPosition.front: deviceWithPosition(CameraPosition.front),
CameraPosition.external: deviceWithPosition(CameraPosition.external),
CameraPosition.unspecified: deviceWithPosition(CameraPosition.unspecified)
};
}
/// Query the camera device with [CameraPosition].
Future<CameraDevice?> queryCameraDevice(CameraPosition position) async {
var device =
(await queryCameraDevices(CameraDeviceType.wideAngleCamera))[position];
if (device == null) {
for (var type in CameraDeviceType.values) {
device = (await queryCameraDevices(type))[position];
if (device != null) {
return device;
}
}
}
return device;
}