Barcode Scanning în aplicații — ce este, tipuri de coduri și ML Kit

Autor: IT Sectr Publicat: 2026-07-18 Timp de citire: 10 min

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 — citirea codurilor unidimensionale și bidimensionale cu camera
  • ML Kit Barcode — cel mai precis SDK (98.5%), multi-cod, toate formatele
  • Formate — EAN, UPC, QR, Data Matrix, PDF417, Aztec, Code 128
  • Real-time — scanare până la 60 FPS cu CameraX și AVFoundation
  • On-device — toate calculele local, fără internet

Ce este Barcode Scanning: principii și formate

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.

FormatTipMax. dateAplicație
EAN-131D13 cifreMărfuri în magazine
QR Code2D4296 caractereLinkuri, plăți, bilete
Data Matrix2D2335 caractereIndustrie, medicină
PDF4172D2710 caractereDocumente, cărți de imbarcare
Code 1281D80 caractereLogistică, 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: integrare și configurare

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%.

kotlin
// 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 vs ML Kit: compararea bibliotecilor

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 KitZXing
Precizie98.5%92%
Viteză15–30 ms50–150 ms
Multi-codDaNu
Google PlayNecesarNu 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.

kotlin
// 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: scanerul nativ pe iOS

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.

swift
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: soluție comercială pentru enterprise

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ă.

kotlin
// 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 scanării: viteză și precizie

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.

kotlin
// 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

Care SDK pentru scanarea codurilor de bare este cel mai bun pe Android?

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.

Ce formate de coduri de bare suportă ML Kit?

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.

Cum să accelerez scanarea codurilor de bare?

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.

Funcționează scanarea codurilor de bare fără internet?

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.

Pot fi scanate codurile de bare deteriorate sau neclare?

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

  • Barcode Scanning — detectarea și decodarea codurilor 1D/2D cu camera smartphone-ului
  • ML Kit — 98.5% precizie, multi-cod, detectare în orice parte a cadrului, gratuit
  • ZXing — open-source, compatibilitate cu orice dispozitiv, 92% precizie
  • AVFoundation — scaner nativ iOS, încorporat în sistem (iOS 7+)
  • Scandit — SDK enterprise (99.5%), SparkScan, MatrixScan, de la $400/lună
  • Optimizare — rezoluție 480p, autofocus, limitarea formatelor, Haptic feedback
  • Toate formatele — EAN, UPC, QR, Data Matrix, PDF417, Aztec, Code 128

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.

Discutați proiectul

Citiți și