import 'package:google_mlkit_document_scanner/google_mlkit_document_scanner.dart'; /// Résultat du scan de document. class DocumentScanResult { /// Chemin de l'image redressée (de face), ou null si l'utilisateur a annulé. final String? imagePath; /// true si un scan a bien été produit. bool get success => imagePath != null; const DocumentScanResult(this.imagePath); } /// Service qui lance le scanner de documents Google ML Kit. /// /// Le scanner ouvre une UI plein écran fournie par Google Play Services : /// caméra, détection des bords de la feuille en direct, recadrage manuel des /// 4 coins, puis renvoie l'image REDRESSÉE de face. Idéal pour une cible de /// tir, qui est imprimée sur un carton/feuille rectangulaire. /// /// NOTE : disponible uniquement sur Android (fonctionnalité ML Kit en bêta). class DocumentScannerService { /// Lance le scanner et renvoie le chemin de l'image redressée. /// /// [pageLimit] est fixé à 1 (une seule cible par scan). /// On désactive l'import galerie ici car la galerie est gérée séparément. /// /// IMPORTANT : on utilise [ScannerMode.base] et NON [ScannerMode.full]. /// - `full`/`filter` appliquent des filtres "document" (noir & blanc, /// rehaussement type photocopie) → détruit les couleurs de la cible. /// - `base` ne fait QUE le recadrage + le redressement de perspective /// (mise de face), en conservant l'image en couleurs réelles. C'est /// indispensable pour pouvoir détecter ensuite les impacts. Future scanTarget() async { final options = DocumentScannerOptions( mode: ScannerMode.base, // redressement seul, sans filtre couleur pageLimit: 1, isGalleryImport: false, ); final scanner = DocumentScanner(options: options); try { final DocumentScanningResult result = await scanner.scanDocument(); final images = result.images; if (images.isEmpty) { return const DocumentScanResult(null); } return DocumentScanResult(images.first); } finally { // Libère les ressources natives du scanner. await scanner.close(); } } }