Barcode Scanning est une technologie de lecture et de décodage de codes-barres à l'aide de la caméra d'un appareil mobile. Contrairement aux scanners laser qui nécessitent un équipement spécialisé, les scanners à caméra fonctionnent sur n'importe quel smartphone avec appareil photo. Dans le développement mobile, le Barcode Scanning est implémenté via ML Kit Barcode Scanning (Google), AVFoundation (Apple), ZXing (open-source) ou Scandit (SDK commercial). Selon Google ML Kit, 2025, la bibliothèque traite plus de 2 milliards de scans par jour avec une précision de 98,5%.
Points clés
Barcode Scanning est le processus de reconnaissance optique des codes-barres à l'aide d'une caméra. L'algorithme capture une image, trouve le code (localisation), le décode (extraction de données) et retourne une valeur de chaîne. Les SDK modernes scannent des codes de toute orientation, taille et éclairage — l'utilisateur n'a qu'à pointer la caméra.
Les formats de codes-barres se divisent en deux groupes : 1D (linéaires) — EAN-13, UPC-A, Code 128, Code 39, ITF, Codabar — contiennent jusqu'à 20–30 caractères, utilisés pour les produits et la logistique ; 2D (matriciels) — QR Code, Data Matrix, PDF417, Aztec — contiennent jusqu'à 3000+ caractères, utilisés pour les liens, billets, documents. ML Kit prend en charge 14 formats — tous les formats 1D et 2D courants.
Data Matrix est un code 2D similaire au QR mais plus compact. Il est utilisé dans l'industrie (marquage de pièces), les billets électroniques (IATA BCBP), les échantillons médicaux. Data Matrix peut contenir jusqu'à 2335 caractères et s'imprime sur de très petites surfaces — jusqu'à 2x2 mm. Contrairement au QR, Data Matrix n'a pas de patterns de localisation (carrés dans les coins) et nécessite un étalonnage de caméra plus précis.
| Format | Type | Données max | Application |
|---|---|---|---|
| EAN-13 | 1D | 13 chiffres | Produits de vente au détail |
| QR Code | 2D | 4296 caractères | Liens, paiements, billets |
| Data Matrix | 2D | 2335 caractères | Industrie, médecine |
| PDF417 | 2D | 2710 caractères | Documents, cartes d'embarquement |
| Code 128 | 1D | 80 caractères | Logistique, transport |
QR Code est le format 2D le plus populaire dans les applications mobiles. Il contient URL, texte, vCard, configuration WiFi, informations de paiement (UPI, SBP). Le QR Code a 40 versions (de 21x21 à 177x177 modules) et 4 niveaux de correction d'erreurs (L : 7%, M : 15%, Q : 25%, H : 30%). Pour les applications mobiles, utilisez la version 2–10 (25x25 – 57x57 modules) — l'équilibre optimal entre taille et données.
ML Kit Barcode Scanning est le SDK principal pour les applications Android. ML Kit trouve automatiquement tous les codes dans l'image (contrairement à ZXing qui nécessite que le code soit au centre). L'API retourne un objet Barcode avec rawValue (contenu texte), format (type de code), boundingBox et cornerPoints (4 points des coins du code). ML Kit prend en charge le single-scan (une image) et le continuous-scan (flux vidéo).
Mode multi-code — ML Kit peut détecter plusieurs codes dans une seule image. Activez-le via BarcodeScannerOptions.Builder(). En mode multiple, une liste de Barcodes est retournée. Utilisez-le pour l'inventaire (scan de lots de produits), la reconnaissance de plusieurs QR codes sur une table. Le multi-code est désactivé par défaut — activez-le uniquement si nécessaire, car il ralentit le scan de 20 à 30%.
// ML Kit Barcode Scanning multi-code mode
val options = BarcodeScannerOptions.Builder()
.setBarcodeFormats(
Barcode.FORMAT_QR_CODE,
Barcode.FORMAT_EAN_13,
Barcode.FORMAT_DATA_MATRIX
)
.enableAllPotentialBarcodes()
.build()
val scanner = BarcodeScanning.getClient(options)
scanner.process(inputImage)
.addOnSuccessListener { barcodes ->
barcodes.forEach { barcode ->
val type = barcode.valueType // URL, TEXT, PHONE...
val rawValue = barcode.rawValue
val displayValue = barcode.displayValue
}
}
Filtrage des formats — optimisation obligatoire. setBarcodeFormats() limite les formats que ML Kit recherchera. Si l'application scanne uniquement des QR codes — spécifiez FORMAT_QR_CODE. Cela accélère le scan de 2 à 3 fois en excluant les algorithmes de décodage des autres formats. Pour les scanners de vente au détail — FORMAT_EAN_13 | FORMAT_UPC_A. Pour la logistique — FORMAT_CODE_128 | FORMAT_CODE_39 | FORMAT_PDF417.
ZXing (Zebra Crossing) est une bibliothèque open-source en Java (Android) avec des ports vers Swift, React Native, Flutter. ZXing était le standard de facto pour le scan avant ML Kit. Il prend en charge tous les formats populaires, fonctionne sur n'importe quel appareil (y compris Huawei sans Google Play) et ne nécessite pas Google Play Services. Inconvénients : 2 à 3 fois plus lent que ML Kit, ne trouve pas les codes sur les bords du cadre, pas de multi-code.
ML Kit vs ZXing — ML Kit gagne en vitesse, précision et UX. ML Kit détecte un code même s'il occupe 10% du cadre et se trouve dans un coin. ZXing nécessite que le code occupe 50 à 80% du cadre et soit au centre. ML Kit utilise un réseau neuronal (MobileNetV2-SSD) pour localiser le code, ZXing utilise une binarisation classique et la recherche de patterns de localisation. Selon Google (2025), ML Kit atteint 98,5% de précision contre 92% pour ZXing.
| Caractéristique | ML Kit | ZXing |
|---|---|---|
| Précision | 98,5% | 92% |
| Vitesse | 15–30 ms | 50–150 ms |
| Multi-code | Oui | Non |
| Google Play | Requis | Non requis |
| Code dans le coin | Détecte | Ne détecte pas |
Quand choisir ZXing : si l'application doit fonctionner sur des appareils Huawei (sans Google Play Services), sur Android Go (mémoire limitée), ou si un fonctionnement entièrement hors ligne sans Play Services est nécessaire. Pour tous les autres cas — ML Kit est plus rapide, plus précis, plus facile à intégrer et offre une meilleure UX grâce au multi-code et à la détection sur les bords.
// ZXing Core: simple scanner
val reader = MultiFormatReader()
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.test)
val source = RGBLuminanceSource(bitmap)
val binarizer = HybridBinarizer(source)
val binaryBitmap = BinaryBitmap(binarizer)
try {
val result = reader.decode(binaryBitmap)
Log.d("ZXing", result.text)
} catch (e: NotFoundException) {
// Code not found
}
Scandit comme alternative — un SDK commercial avec 99,5% de précision et une vitesse de 10–20 ms. Il utilise ses propres réseaux neuronaux et ne nécessite pas Google Play Services. Prix — à partir de 400 $/mois (2019). Scandit domine dans le retail et la logistique (Walmart, FedEx). Pour la plupart des applications mobiles, ML Kit est suffisant — Scandit n'est justifié que pour les tâches enterprise avec un scan à haut volume.
Apple AVFoundation fournit un Barcode Scanning natif via AVCaptureMetadataOutput. Depuis iOS 7, AVFoundation prend en charge le scan de QR codes, et depuis iOS 8 — tous les formats EAN, UPC, Code 128, PDF417. AVFoundation ne nécessite pas de SDK supplémentaires — il fait partie de Foundation. Le scan fonctionne via Apple Neural Engine sur A12+ — vitesse de 10–20 ms avec une consommation d'énergie minimale.
Avantages d'AVFoundation : zéro dépendance, gestion automatique de l'orientation de la caméra, prise en charge intégrée du mode clair/foncé, fonctionnement en arrière-plan (avec background modes). AVFoundation ajuste automatiquement l'autofocus et l'exposition pour le scan — le développeur n'a qu'à s'abonner au délégué captureOutput. Inconvénient : moins de réglages que ML Kit — impossible d'activer le multi-code ou le filtrage des formats.
import AVFoundation
class BarcodeScannerController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
private var captureSession: AVCaptureSession!
override func viewDidLoad() {
let metadataOutput = AVCaptureMetadataOutput()
captureSession.addOutput(metadataOutput)
metadataOutput.setMetadataObjectsDelegate(self, queue: .main)
metadataOutput.metadataObjectTypes = [.qr, .ean13, .code128]
}
func metadataOutput(_ output: AVCaptureMetadataOutput,
didOutput objects: [AVMetadataObject],
from connection: AVCaptureConnection) {
guard let code = objects.first as? AVMetadataMachineReadableCodeObject else { return }
print(code.stringValue ?? "")
}
}
ML Kit vs AVFoundation sur iOS : ML Kit offre plus de contrôle — vous pouvez configurer les formats, activer le multi-code, filtrer les codes par confiance. AVFoundation est plus rapide sur les anciens appareils (moins de surcharge), mais ne prend pas en charge Data Matrix, Aztec, PDF417 sur iOS < 15. Pour iOS 15+, ML Kit est préférable. Pour iOS 12–14, utilisez AVFoundation + repli sur ML Kit pour les formats non supportés.
Scandit est un SDK commercial pour Barcode Scanning axé sur le retail, la logistique et la santé. Scandit utilise ses propres réseaux neuronaux entraînés sur plus de 10 millions d'images de codes-barres dans diverses conditions : reflets, dommages, faible luminosité, inclinaison jusqu'à 45°, réflexions. Scandit scanne des codes à des distances allant jusqu'à 15 mètres (pour PDF417 dans les entrepôts) et sur des surfaces courbes (canettes, bouteilles).
Fonctionnalités de Scandit : SparkScan (scan unique pour un scan séquentiel rapide), MatrixScan (multi-code + surbrillance AR des articles scannés), PickList (recherche de produit par code-barres avec confirmation). Scandit prend en charge plus de 50 formats, dont GS1 DataBar et Composite Codes. Vitesse — 10–15 ms par code. Précision — 99,5% sous éclairage standard, 97% sous faible luminosité.
// Scandit MatrixScan (SDK license required)
val barcodeTracking = BarcodeTracking
.forDataCaptureContext(context)
.addListener(this)
.build()
barcodeTracking.addSessionListener { session, _ ->
session.trackedBarcodes.forEach { (trackingId, barcode) ->
val data = barcode.data
val symbolCount = barcode.symbolCount
}
}
Scandit vs ML Kit : Scandit est payant (400 $+/mois), mais offre des fonctionnalités enterprise : SparkScan (bouton matériel sur les appareils d'entreprise), MatrixScan (superposition AR pour la surbrillance), PickList (confirmation vocale). ML Kit est gratuit et suffisant pour 90% des applications mobiles : scanners de magasin, lecteurs QR, applications de billets. Scandit n'est justifié que pour les terminaux logistiques avec des appareils Zebra/Honeywell.
L'optimisation du Barcode Scanning inclut les réglages de la caméra, de la résolution et du SDK. La règle principale : moins de pixels — scan plus rapide. Pour ML Kit, la résolution optimale est 480p (640x480) pour la vidéo et 720p (1280x720) pour les photos. Passer à 1080p ralentit le traitement de 2 à 3 fois sans gain de précision. Utilisez CameraX avec ImageAnalysis pour une gestion automatique de la résolution.
La mise au point et l'exposition sont cruciales pour la qualité du scan. ML Kit ne configure pas la caméra automatiquement — le développeur doit activer l'autofocus continu et l'exposition automatique continue via Camera2 ou CameraX. Sans autofocus, les codes flous réduisent la précision à 60–70%. Pour le scan de près (5–15 cm), utilisez le mode macro de la caméra s'il est disponible.
Auto-zoom et superposition de localisation — améliorations UX pour l'utilisateur. L'auto-zoom agrandit le code lors de sa détection (comme dans la caméra Google Lens). Implémenté en analysant le boundingBox du code et en redimensionnant l'aperçu. La superposition de localisation est un cadre graphique indiquant où pointer la caméra. Pour une meilleure UX, affichez le boundingBox du code trouvé et surlignez-le en vert lors du décodage réussi.
// CameraX + ML Kit: optimized scanner
class BarcodeAnalyzer(private val scanner: BarcodeScanner) :
ImageAnalysis.Analyzer {
override fun analyze(image: ImageProxy) {
if (image.image == null) { image.close(); return }
val mediaImage = InputImage.fromMediaImage(image.image, image.imageInfo.rotationDegrees)
scanner.process(mediaImage)
.addOnSuccessListener { barcodes ->
barcodes.firstOrNull()?.let {
// Haptic + sound + code highlight
}
}
.addOnCompleteListener { image.close() }
}
}
Retour utilisateur : vibration (HapticFeedback), son (MediaActionSound), surbrillance visuelle (Canvas/Overlay). Après un scan réussi, ajoutez un délai de 1000–1500 ms (limitation) avant le scan suivant — cela évite les déclenchements en double sur le même code. Pour le scan séquentiel (scan de lots), utilisez l'approche SparkScan : chaque scan est enregistré et annoncé, avec un délai de 300–500 ms.
Questions fréquentes
ML Kit Barcode Scanning est le meilleur choix pour Android : gratuit, 98,5% de précision, multi-code, détection dans n'importe quelle partie du cadre. Si l'application doit fonctionner sur des appareils Huawei sans Google Play — utilisez ZXing (open-source, moins précis). Pour la logistique enterprise — Scandit (payant, 99,5% de précision, SparkScan). Pour un simple lecteur QR, ZXing ou ML Kit suffisent.
ML Kit Barcode Scanning prend en charge 14 formats : 1D — EAN-8, EAN-13, UPC-A, UPC-E, Code 39, Code 93, Code 128, ITF, Codabar ; 2D — QR Code, Data Matrix, PDF417, Aztec. GS1 DataBar (RSS-14, RSS-Expanded) est également pris en charge. La liste complète se trouve dans la documentation Barcode.FORMAT_*. Pour limiter les formats, utilisez setBarcodeFormats() — cela accélère le scan de 2 à 3 fois.
Réduisez la résolution de la caméra à 480p (640x480), activez l'autofocus continu, limitez les formats aux nécessaires (setBarcodeFormats), utilisez le mode de performance FAST. Pour ML Kit, spécifiez uniquement les formats nécessaires — exclure les formats supplémentaires accélère le scan de 2 à 3 fois. Pour ZXing — utilisez HybridBinarizer au lieu de GlobalHistogramBinarizer (20% plus rapide). Pour AVFoundation — spécifiez metadataObjectTypes.
Oui, tous les SDK locaux de Barcode Scanning (ML Kit, ZXing, AVFoundation, Scandit) fonctionnent entièrement hors ligne. ML Kit nécessite internet uniquement pour le téléchargement initial du modèle (mode téléchargé), après quoi le modèle est mis en cache sur l'appareil. AVFoundation est intégré à iOS, ne nécessite pas internet. ZXing est entièrement hors ligne sans Play Services. Le scan cloud (Google Cloud Vision) n'est pas utilisé dans les applications mobiles.
ML Kit et Scandit disposent d'une correction intégrée pour les codes endommagés grâce aux algorithmes de réseaux neuronaux. ML Kit restaure jusqu'à 30% d'un code endommagé (rayures, déchirures). Scandit — jusqu'à 50% grâce à l'entraînement sur des codes défectueux. ZXing ne restaure pratiquement pas les codes endommagés — il nécessite une image nette. Pour scanner des codes défectueux, utilisez Scandit ou ML Kit avec le mode de performance ACCURATE.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi