getBestResolutionForCamera function
Future<ResolutionPreset>
getBestResolutionForCamera(
- CameraDescription camera
)
Implementation
Future<ResolutionPreset> getBestResolutionForCamera(
CameraDescription camera) async {
try {
final DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
AndroidDeviceInfo? androidInfo;
IosDeviceInfo? iosInfo;
int? memory = await SystemInfoPlus.physicalMemory;
double totalRAMGB = memory! / 1000;
if (Platform.isAndroid) {
androidInfo = await deviceInfo.androidInfo;
} else if (Platform.isIOS) {
iosInfo = await deviceInfo.iosInfo;
}
if (androidInfo != null) {
debugPrint('Info is not empty');
if (totalRAMGB < 4 || androidInfo.supportedAbis.isEmpty) {
debugPrint('Low-end device detected. Using low resolution.');
return ResolutionPreset.low;
}
if (totalRAMGB < 6) {
debugPrint('Mid-range device detected. Using medium resolution.');
return ResolutionPreset.medium;
}
if (totalRAMGB < 8) {
debugPrint('High-range device detected. Using medium resolution.');
return ResolutionPreset.high;
}
}
if (iosInfo != null) {
if (iosInfo.name.contains('iPhone 6') ||
iosInfo.name.contains('iPhone 7') ||
iosInfo.name.contains('iPhone 8') ||
iosInfo.name.contains('iPhone SE')) {
debugPrint('Lower-end iOS device detected. Using medium resolution.');
return ResolutionPreset.medium;
}
}
final presets = [
ResolutionPreset.high,
ResolutionPreset.medium,
ResolutionPreset.low,
];
for (final preset in presets) {
try {
final controller = CameraController(
camera,
preset,
enableAudio: false,
);
await controller.initialize();
if (controller.value.isInitialized) {
final fps = await controller.getMaxZoomLevel();
if (fps < 1.0) {
await controller.dispose();
continue;
}
}
await controller.dispose();
debugPrint('Selected camera resolution: $preset');
return preset;
} catch (e) {
debugPrint('Failed to initialize camera at resolution $preset: $e');
continue;
}
}
debugPrint('Defaulting to low resolution for stability');
return ResolutionPreset.low;
} catch (e) {
debugPrint('Error determining camera resolution: $e');
return ResolutionPreset.low;
}
}