Barcode Scanning — este tehnologia de citire și decodare a codurilor de bare cu ajutorul camerei unui dispozitiv mobil. Spre deosebire de scanerele laser, care necesită echipamente specializate, scanerele cu cameră funcționează pe orice smartphone cu cameră. În dezvoltarea mobilă, Barcode Scanning este implementat prin ML Kit Barcode Scanning (Google), AVFoundation (Apple), ZXing (open-source) sau Scandit (SDK comercial). Potrivit Google ML Kit, 2025, biblioteca procesează 2+ miliarde de scanări pe zi cu o precizie de 98.5%.
Principalele
Barcode Scanning — procesul de recunoaștere optică a codurilor de bare cu ajutorul camerei. Algoritmul captează imaginea, găsește codul pe ea (localizare), îl decodifică (extragerea datelor) și returnează o valoare șir. SDK-urile moderne scanează coduri de orice orientare, dimensiune și în orice condiții de iluminare — utilizatorul trebuie doar să îndrepte camera.
Formatele codurilor de bare se împart în două grupuri: 1D (liniare) — EAN-13, UPC-A, Code 128, Code 39, ITF, Codabar — conțin până la 20–30 de caractere, folosite pentru mărfuri, logistică; 2D (matriceale) — QR Code, Data Matrix, PDF417, Aztec — conțin până la 3000+ caractere, folosite pentru linkuri, bilete, documente. ML Kit suportă 14 formate — toate formatele populare 1D și 2D.
Data Matrix — cod bidimensional, similar cu QR, dar mai compact. Folosit în industrie (marcarea pieselor), bilete electronice (IATA BCBP), probe medicale. Data Matrix poate conține până la 2335 de caractere și se aplică pe suprafețe foarte mici — până la 2x2 mm. Spre deosebire de QR, Data Matrix nu are modele de căutare (pătrate în colțuri) și necesită o calibrare mai precisă a camerei.
| Format | Tip | Max. date | Aplicație |
|---|---|---|---|
| EAN-13 | 1D | 13 cifre | Mărfuri în magazine |
| QR Code | 2D | 4296 caractere | Linkuri, plăți, bilete |
| Data Matrix | 2D | 2335 caractere | Industrie, medicină |
| PDF417 | 2D | 2710 caractere | Documente, cărți de imbarcare |
| Code 128 | 1D | 80 caractere | Logistică, transport |
QR Code — cel mai popular format bidimensional în aplicațiile mobile. Conține URL, text, vCard, configurație WiFi, informații de plată (UPI, SBP). QR Code are 40 de versiuni (de la 21x21 la 177x177 module) și 4 niveluri de corecție a erorilor (L: 7%, M: 15%, Q: 25%, H: 30%). Pentru aplicații mobile, folosiți versiunile 2–10 (25x25 – 57x57 module) — echilibrul optim între dimensiune și date.
ML Kit Barcode Scanning — SDK-ul principal pentru aplicații Android. ML Kit găsește independent toate codurile din imagine (spre deosebire de ZXing, care necesită ca codul să fie în centru). API-ul returnează un obiect Barcode cu rawValue (conținut text), format (tip cod), boundingBox și cornerPoints (4 puncte ale colțurilor codului). ML Kit suportă single-scan (un cadru) și continuous-scan (flux video).
Modul multi-cod — ML Kit poate detecta mai multe coduri pe o singură imagine. Activați prin BarcodeScannerOptions.Builder(). În modul multi, se returnează o listă de Barcode. Folosiți pentru inventariere (scanarea unui lot de produse), recunoașterea mai multor coduri QR pe o masă. În mod implicit, multi-codul este dezactivat — activați doar dacă este necesar, deoarece încetinește scanarea cu 20–30%.
// Modul multi-cod ML Kit Barcode Scanning
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, TELEFON...
val rawValue = barcode.rawValue
val displayValue = barcode.displayValue
}
}
Filtrarea formatelor — optimizare obligatorie. setBarcodeFormats() limitează formatele pe care ML Kit le va căuta. Dacă aplicația scanează doar coduri QR — specificați FORMAT_QR_CODE. Aceasta accelerează scanarea de 2–3 ori prin excluderea algoritmilor de decodare a altor formate. Pentru scanerul de magazin — FORMAT_EAN_13 | FORMAT_UPC_A. Pentru logistică — FORMAT_CODE_128 | FORMAT_CODE_39 | FORMAT_PDF417.
ZXing (Zebra Crossing) — bibliotecă open-source în Java (Android) cu porturi pentru Swift, React Native, Flutter. ZXing a fost standardul de facto pentru scanare înainte de apariția ML Kit. Suportă toate formatele populare, funcționează pe orice dispozitiv (inclusiv Huawei fără Google Play), nu necesită Google Play Services. Dezavantaje: de 2–3 ori mai lent decât ML Kit, nu găsește coduri la periferia cadrului, fără multi-cod.
ML Kit vs ZXing — ML Kit câștigă la viteză, precizie și UX. ML Kit detectează codul chiar dacă ocupă 10% din cadru și se află în colț. ZXing necesită ca codul să ocupe 50–80% din cadru și să fie în centru. ML Kit folosește o rețea neurală (MobileNetV2-SSD) pentru localizarea codului, ZXing — binarizare clasică și căutarea modelelor de identificare. Potrivit Google (2025), ML Kit oferă 98.5% precizie față de 92% la ZXing.
| Caracteristică | ML Kit | ZXing |
|---|---|---|
| Precizie | 98.5% | 92% |
| Viteză | 15–30 ms | 50–150 ms |
| Multi-cod | Da | Nu |
| Google Play | Necesar | Nu e necesar |
| Cod în colț | Detectează | Nu detectează |
Când să alegeți ZXing: dacă aplicația trebuie să funcționeze pe dispozitive Huawei (fără Google Play Services), pe Android Go (memorie limitată), sau dacă este necesară funcționarea complet offline fără Play Services. În toate celelalte cazuri — ML Kit este mai rapid, mai precis, mai simplu de integrat și oferă un UX mai bun datorită multi-codului și detectării la periferie.
// ZXing Core: scaner simplu
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) {
// Codul nu a fost găsit
}
Scandit ca alternativă — SDK comercial cu precizie de 99.5% și viteză de 10–20 ms. Folosește propriile rețele neuronale și nu necesită Google Play Services. Preț — de la $400/lună (2019). Scandit domină în retail și logistică (Walmart, FedEx). Pentru majoritatea aplicațiilor mobile, ML Kit este suficient — Scandit se justifică doar pentru sarcini enterprise cu scanare de volum mare.
Apple AVFoundation oferă Barcode Scanning nativ prin AVCaptureMetadataOutput. începând cu iOS 7, AVFoundation suportă scanarea codurilor QR, iar de la iOS 8 — toate formatele EAN, UPC, Code 128, PDF417. AVFoundation nu necesită instalarea de SDK-uri suplimentare — face parte din Foundation. Scanarea funcționează prin Apple Neural Engine pe A12+ — viteză de 10–20 ms cu consum minim de energie.
Avantajele AVFoundation: dependență zero, gestionarea automată a orientării camerei, suport încorporat pentru modul luminos/întunecat, funcționare în fundal (cu background modes). AVFoundation configurează automat autofocusul și expunerea pentru scanare — dezvoltatorul trebuie doar să se aboneze la delegatul captureOutput. Dezavantaj: mai puține setări decât în ML Kit — nu se poate activa multi-codul sau filtrul de formate.
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 pe iOS: ML Kit oferă mai mult control — puteți configura formate, activa multi-cod, filtra coduri după confidence. AVFoundation este mai rapid pe dispozitivele vechi (mai puțin overhead), dar nu suportă Data Matrix, Aztec, PDF417 pe iOS < 15. Pentru iOS 15+, ML Kit este preferat. Pentru iOS 12–14, folosiți AVFoundation + fallback la ML Kit pentru formatele nesuportate.
Scandit — SDK comercial pentru Barcode Scanning axat pe retail, logistică și sănătate. Scandit folosește propriile rețele neuronale, antrenate pe 10+ milioane de imagini cu coduri de bare în diverse condiții: reflexii, deteriorări, iluminare slabă, înclinare până la 45°, reflexii. Scandit scanează coduri de la distanțe de până la 15 metri (pentru PDF417 în depozite) și pe suprafețe rotunde (cutii, sticle).
Capabilități Scandit: SparkScan (single-scan pentru scanare secvențială rapidă), MatrixScan (multi-cod + iluminare AR a celor scanate), PickList (căutarea produsului după cod de bare cu confirmare). Scandit suportă 50+ formate, inclusiv GS1 DataBar și Composite Codes. Viteză — 10–15 ms per cod. Precizie — 99.5% în iluminare standard, 97% în condiții de iluminare slabă.
// Scandit MatrixScan (licență SDK necesară)
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 este contra cost ($400+/lună), dar oferă funcții enterprise: SparkScan (buton hardware pe dispozitive corporative), MatrixScan (suprapunere AR pentru iluminare), PickList (confirmare vocală). ML Kit este gratuit și suficient pentru 90% dintre aplicațiile mobile: scanere de magazin, cititoare QR, aplicații de bilete. Scandit se justifică doar pentru terminale logistice cu dispozitive Zebra/Honeywell.
Optimizarea Barcode Scanning include configurarea camerei, rezoluției și SDK-ului. Regula principală: mai puțini pixeli — scanare mai rapidă. Pentru ML Kit, rezoluția optimă este 480p (640x480) pentru video și 720p (1280x720) pentru fotografii. Creșterea la 1080p încetinește procesarea de 2–3 ori fără a crește precizia. Folosiți CameraX cu ImageAnalysis pentru gestionarea automată a rezoluției.
Focalizarea și expunerea sunt critice pentru calitatea scanării. ML Kit nu configurează automat camera — dezvoltatorul trebuie să activeze continuous auto-focus și continuous auto-exposure prin Camera2 sau CameraX. Fără autofocus, codurile neclare reduc precizia la 60–70%. Pentru scanarea de la distanță apropiată (5–15 cm), folosiți modul macro al camerei, dacă este disponibil.
Auto-zoom și suprapunerea ghidului — îmbunătățiri UX pentru utilizator. Auto-zoom apropie codul atunci când este detectat (ca în camera Google Lens). Se implementează prin analiza boundingBox-ului codului și scalarea previzualizării. Suprapunerea ghidului — un cadru grafic care arată unde să direcționați camera. Pentru un UX mai bun, afișați boundingBox-ul codului găsit și evidențiați-l cu verde la decodarea cu succes.
// CameraX + ML Kit: scaner optimizat
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 + sunet + evidențiere cod
}
}
.addOnCompleteListener { image.close() }
}
}
Feedback pentru utilizator: vibrație (HapticFeedback), sunet (MediaActionSound), iluminare vizuală (Canvas/Overlay). După o scanare reușită, adăugați o întârziere de 1000–1500 ms (throttling) înainte de următoarea scanare — aceasta previne duplicarea declanșărilor pe același cod. Pentru scanarea secvențială (scanarea unui lot de produse), folosiți abordarea SparkScan: fiecare scanare este înregistrată și sonorizată, întârziere 300–500 ms.
Întrebări frecvente
ML Kit Barcode Scanning — cea mai bună alegere pentru Android: gratuit, 98.5% precizie, multi-cod, detectare în orice parte a cadrului. Dacă aplicația trebuie să funcționeze pe dispozitive Huawei fără Google Play — folosiți ZXing (open-source, precizie mai mică). Pentru logistică enterprise — Scandit (plătit, 99.5% precizie, SparkScan). Pentru un cititor QR simplu, ZXing sau ML Kit sunt suficiente.
ML Kit Barcode Scanning suportă 14 formate: 1D — EAN-8, EAN-13, UPC-A, UPC-E, Code 39, Code 93, Code 128, ITF, Codabar; 2D — QR Code, Data Matrix, PDF417, Aztec. De asemenea, suportă GS1 DataBar (RSS-14, RSS-Expanded). Lista completă — în documentația Barcode.FORMAT_*. Pentru limitarea formatelor, folosiți setBarcodeFormats() — aceasta accelerează scanarea de 2–3 ori.
Reduceți rezoluția camerei la 480p (640x480), activați continuous auto-focus, limitați formatele la cele necesare (setBarcodeFormats), folosiți modul FAST performance. Pentru ML Kit, specificați doar formatele necesare — excluderea formatelor inutile accelerează scanarea de 2–3 ori. Pentru ZXing — folosiți HybridBinarizer în loc de GlobalHistogramBinarizer (cu 20% mai rapid). Pentru AVFoundation — specificați metadataObjectTypes.
Da, toate SDK-urile locale de Barcode Scanning (ML Kit, ZXing, AVFoundation, Scandit) funcționează complet offline. ML Kit necesită internet doar la prima descărcare a modelului (modul downloaded), după care modelul este stocat în cache pe dispozitiv. AVFoundation — încorporat în iOS, nu necesită internet. ZXing — complet offline fără Play Services. Scanarea în cloud (Google Cloud Vision) nu este utilizată în aplicațiile mobile.
ML Kit și Scandit au corecție încorporată pentru codurile deteriorate datorită algoritmilor cu rețele neuronale. ML Kit restabilește până la 30% din codul deteriorat (zgărieturi, rupturi). Scandit — până la 50% datorită antrenării pe coduri defecte. ZXing practic nu restabilește codurile deteriorate — necesită o imagine clară. Pentru scanarea codurilor defecte, folosiți Scandit sau ML Kit cu modul ACCURATE performance.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și