pickFromGallery static method

Future<String?> pickFromGallery()

Pick an image from the gallery. Samsung devices route through SAF / ACTION_OPEN_DOCUMENT because their stock gallery strips EXIF; other platforms use ImagePicker directly.

Implementation

static Future<String?> pickFromGallery() async {
  try {
    if (Platform.isAndroid) {
      final info = await DeviceInfoPlugin().androidInfo;

      final brand = info.brand.toLowerCase();
      final manufacturer = info.manufacturer.toLowerCase();
      final model = info.model.toLowerCase();

      final isSamsung = brand.contains('samsung') ||
          manufacturer.contains('samsung') ||
          model.startsWith('sm-');

      String? path;

      if (isSamsung) {
        try {
          path = await _channel.invokeMethod<String>('openDocumentImage');
        } on PlatformException catch (e) {
          debugPrint(
              'openDocumentImage failed on Samsung, fallback to gallery: $e');
        }
      }

      if (path == null || path.isEmpty) {
        final picker = ImagePicker();
        final picked = await picker.pickImage(source: ImageSource.gallery);
        path = picked?.path;
      }

      if (path == null) return null;

      try {
        final status =
            await _channel.invokeMethod<String>('checkGps', {'path': path});
        if (status == 'FAKE') {
          await removeGps(path: path);
        }
      } catch (e) {
        debugPrint('checkGps/removeGps error: $e');
      }

      return path;
    } else {
      final picker = ImagePicker();
      final picked = await picker.pickImage(source: ImageSource.gallery);
      return picked?.path;
    }
  } catch (e) {
    debugPrint('pickFromGallery error: $e');
    return null;
  }
}