getBestResolutionForCamera function

Future<ResolutionPreset> getBestResolutionForCamera(
  1. 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;
  }
}