Scansione di codici a barre nelle app — tipi di codici e ML Kit

Autore: IT Sectr Pubblicato: 2026-07-18 Tempo di lettura: 10 min

Barcode Scanning è una tecnologia per leggere e decodificare i codici a barre utilizzando la fotocamera di un dispositivo mobile. A differenza degli scanner laser che richiedono attrezzature specializzate, gli scanner a fotocamera funzionano su qualsiasi smartphone con fotocamera. Nello sviluppo mobile, Barcode Scanning viene implementato tramite ML Kit Barcode Scanning (Google), AVFoundation (Apple), ZXing (open-source) o Scandit (SDK commerciale). Secondo Google ML Kit, 2025, la libreria elabora oltre 2 miliardi di scansioni al giorno con una precisione del 98,5%.

Punti chiave

  • Barcode Scanning — lettura di codici 1D e 2D con la fotocamera
  • ML Kit Barcode — l'SDK più preciso (98,5%), multi-codice, tutti i formati
  • Formati — EAN, UPC, QR, Data Matrix, PDF417, Aztec, Code 128
  • In tempo reale — scansione fino a 60 FPS con CameraX e AVFoundation
  • Su dispositivo — tutta l'elaborazione in locale, senza internet

Cos'è Barcode Scanning: principi e formati

Barcode Scanning è il processo di riconoscimento ottico dei codici a barre tramite una fotocamera. L'algoritmo cattura un'immagine, trova il codice (localizzazione), lo decodifica (estrazione dei dati) e restituisce un valore stringa. Gli SDK moderni scansionano codici di qualsiasi orientamento, dimensione e illuminazione — l'utente deve solo puntare la fotocamera.

I formati di codici a barre si dividono in due gruppi: 1D (lineari) — EAN-13, UPC-A, Code 128, Code 39, ITF, Codabar — contengono fino a 20–30 caratteri, utilizzati per prodotti e logistica; 2D (matriciali) — QR Code, Data Matrix, PDF417, Aztec — contengono fino a oltre 3000 caratteri, utilizzati per link, biglietti, documenti. ML Kit supporta 14 formati — tutti i formati 1D e 2D comuni.

Data Matrix è un codice 2D simile al QR ma più compatto. Viene utilizzato nell'industria (marcatura di parti), biglietti elettronici (IATA BCBP), campioni medici. Data Matrix può contenere fino a 2335 caratteri e può essere stampato su superfici molto piccole — fino a 2x2 mm. A differenza del QR, Data Matrix non ha pattern di localizzazione (quadrati negli angoli) e richiede una calibrazione della fotocamera più precisa.

FormatoTipoDati maxApplicazione
EAN-131D13 cifreProdotti al dettaglio
QR Code2D4296 caratteriLink, pagamenti, biglietti
Data Matrix2D2335 caratteriIndustria, medicina
PDF4172D2710 caratteriDocumenti, carte d'imbarco
Code 1281D80 caratteriLogistica, trasporto

QR Code è il formato 2D più popolare nelle applicazioni mobili. Contiene URL, testo, vCard, configurazione WiFi, informazioni di pagamento (UPI, SBP). Il QR Code ha 40 versioni (da 21x21 a 177x177 moduli) e 4 livelli di correzione errori (L: 7%, M: 15%, Q: 25%, H: 30%). Per le app mobili utilizzare la versione 2–10 (25x25 – 57x57 moduli) — il giusto equilibrio tra dimensione e dati.

ML Kit Barcode Scanning: integrazione e configurazione

ML Kit Barcode Scanning è l'SDK principale per applicazioni Android. ML Kit trova automaticamente tutti i codici nell'immagine (a differenza di ZXing che richiede che il codice sia al centro). L'API restituisce un oggetto Barcode con rawValue (contenuto testo), format (tipo di codice), boundingBox e cornerPoints (4 punti degli angoli del codice). ML Kit supporta la scansione singola (single-scan) e la scansione continua (continuous-scan).

Modalità multi-codice — ML Kit può rilevare più codici in una singola immagine. Attivala tramite BarcodeScannerOptions.Builder(). In modalità multipla viene restituita una lista di Barcode. Utilizzare per inventario (scansione di lotti di prodotti), riconoscimento di più codici QR su un tavolo. Il multi-codice è disattivato per impostazione predefinita — attivarlo solo se necessario, poiché rallenta la scansione del 20–30%.

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

Filtraggio dei formati — ottimizzazione obbligatoria. setBarcodeFormats() limita i formati che ML Kit cercherà. Se l'app scansiona solo codici QR — specificare FORMAT_QR_CODE. Questo accelera la scansione di 2–3 volte escludendo algoritmi di decodifica di altri formati. Per scanner al dettaglio — FORMAT_EAN_13 | FORMAT_UPC_A. Per logistica — FORMAT_CODE_128 | FORMAT_CODE_39 | FORMAT_PDF417.

ZXing vs ML Kit: confronto delle librerie

ZXing (Zebra Crossing) è una libreria open-source in Java (Android) con port per Swift, React Native, Flutter. ZXing era lo standard de facto per la scansione prima di ML Kit. Supporta tutti i formati popolari, funziona su qualsiasi dispositivo (incluso Huawei senza Google Play) e non richiede Google Play Services. Svantaggi: 2–3 volte più lento di ML Kit, non trova i codici ai bordi dell'inquadratura, nessun multi-codice.

ML Kit vs ZXing — ML Kit vince in velocità, precisione e UX. ML Kit rileva un codice anche se occupa il 10% dell'inquadratura e si trova in un angolo. ZXing richiede che il codice occupi il 50–80% dell'inquadratura e sia al centro. ML Kit utilizza una rete neurale (MobileNetV2-SSD) per localizzare il codice, ZXing utilizza binarizzazione classica e ricerca di pattern di localizzazione. Secondo Google (2025), ML Kit raggiunge il 98,5% di precisione contro il 92% di ZXing.

CaratteristicaML KitZXing
Precisione98,5%92%
Velocità15–30 ms50–150 ms
Multi-codiceNo
Google PlayRichiestoNon richiesto
Codice nell'angoloRilevaNon rileva

Quando scegliere ZXing: se l'app deve funzionare su dispositivi Huawei (senza Google Play Services), su Android Go (memoria limitata), o se è necessario il funzionamento completamente offline senza Play Services. Per tutti gli altri casi — ML Kit è più veloce, più preciso, più facile da integrare e offre una migliore UX grazie al multi-codice e al rilevamento ai bordi.

kotlin
// 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 come alternativa — un SDK commerciale con precisione del 99,5% e velocità di 10–20 ms. Utilizza reti neurali proprietarie e non richiede Google Play Services. Prezzo — da $400/mese (2019). Scandit domina nel retail e nella logistica (Walmart, FedEx). Per la maggior parte delle app mobili ML Kit è sufficiente — Scandit è giustificato solo per attività enterprise con scansione ad alto volume.

Apple AVFoundation: scanner nativo su iOS

Apple AVFoundation fornisce Barcode Scanning nativo tramite AVCaptureMetadataOutput. Da iOS 7, AVFoundation supporta la scansione di codici QR, e da iOS 8 — tutti i formati EAN, UPC, Code 128, PDF417. AVFoundation non richiede SDK aggiuntivi — fa parte di Foundation. La scansione funziona tramite Apple Neural Engine su A12+ — velocità di 10–20 ms con consumo energetico minimo.

Vantaggi di AVFoundation: zero dipendenze, gestione automatica dell'orientamento della fotocamera, supporto integrato della modalità chiara/scura, funzionamento in background (con background modes). AVFoundation regola automaticamente messa a fuoco ed esposizione per la scansione — lo sviluppatore deve solo sottoscrivere il delegato captureOutput. Svantaggio: meno impostazioni di ML Kit — non è possibile attivare multi-codice o filtraggio dei formati.

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 su iOS: ML Kit offre più controllo — è possibile configurare i formati, attivare il multi-codice, filtrare i codici per affidabilità. AVFoundation è più veloce sui dispositivi più vecchi (meno overhead), ma non supporta Data Matrix, Aztec, PDF417 su iOS < 15. Per iOS 15+ ML Kit è preferibile. Per iOS 12–14 utilizzare AVFoundation + fallback su ML Kit per i formati non supportati.

Scandit: soluzione commerciale per enterprise

Scandit è un SDK commerciale per Barcode Scanning focalizzato su retail, logistica e sanità. Scandit utilizza reti neurali proprietarie addestrate su oltre 10 milioni di immagini di codici a barre in varie condizioni: bagliori, danni, scarsa illuminazione, inclinazione fino a 45°, riflessi. Scandit scansiona codici a distanze fino a 15 metri (per PDF417 nei magazzini) e su superfici curve (lattine, bottiglie).

Funzionalità di Scandit: SparkScan (scansione singola per scansione sequenziale rapida), MatrixScan (multi-codice + evidenziazione AR degli elementi scansionati), PickList (ricerca prodotto per codice a barre con conferma). Scandit supporta oltre 50 formati, inclusi GS1 DataBar e Composite Codes. Velocità — 10–15 ms per codice. Precisione — 99,5% in condizioni di illuminazione standard, 97% in condizioni di scarsa luce.

kotlin
// 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 è a pagamento ($400+/mese), ma offre funzionalità enterprise: SparkScan (pulsante hardware su dispositivi aziendali), MatrixScan (sovrapposizione AR per evidenziazione), PickList (conferma vocale). ML Kit è gratuito e sufficiente per il 90% delle app mobili: scanner di negozi, lettori QR, app per biglietti. Scandit è giustificato solo per terminali logistici con dispositivi Zebra/Honeywell.

Ottimizzazione della scansione: velocità e precisione

Ottimizzazione del Barcode Scanning include impostazioni di fotocamera, risoluzione e SDK. La regola principale: meno pixel — scansione più veloce. Per ML Kit la risoluzione ottimale è 480p (640x480) per il video e 720p (1280x720) per le foto. L'aumento a 1080p rallenta l'elaborazione di 2–3 volte senza migliorare la precisione. Utilizzare CameraX con ImageAnalysis per la gestione automatica della risoluzione.

Messa a fuoco ed esposizione sono critiche per la qualità della scansione. ML Kit non configura automaticamente la fotocamera — lo sviluppatore deve attivare la messa a fuoco automatica continua e l'esposizione automatica continua tramite Camera2 o CameraX. Senza autofocus, i codici sfocati riducono la precisione al 60–70%. Per la scansione ravvicinata (5–15 cm) utilizzare la modalità macro della fotocamera se disponibile.

Zoom automatico e overlay di localizzazione — miglioramenti UX per l'utente. Lo zoom automatico ingrandisce il codice quando rilevato (come nella fotocamera di Google Lens). Implementato analizzando il boundingBox del codice e ridimensionando l'anteprima. L'overlay di localizzazione è una cornice grafica che mostra dove puntare la fotocamera. Per una migliore UX, mostrare il boundingBox del codice trovato ed evidenziarlo in verde in caso di decodifica riuscita.

kotlin
// 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() }
    }
}

Feedback all'utente: vibrazione (HapticFeedback), suono (MediaActionSound), evidenziazione visiva (Canvas/Overlay). Dopo una scansione riuscita, aggiungere un ritardo di 1000–1500 ms (limitazione) prima della scansione successiva — questo evita attivazioni duplicate sullo stesso codice. Per la scansione sequenziale (scansione di lotti) utilizzare l'approccio SparkScan: ogni scansione viene registrata e annunciata, con un ritardo di 300–500 ms.

Domande frequenti

Quale SDK è migliore per la scansione di codici a barre su Android?

ML Kit Barcode Scanning è la scelta migliore per Android: gratuito, precisione del 98,5%, multi-codice, rilevamento in qualsiasi parte dell'inquadratura. Se l'app deve funzionare su dispositivi Huawei senza Google Play — utilizzare ZXing (open-source, minore precisione). Per la logistica enterprise — Scandit (a pagamento, precisione del 99,5%, SparkScan). Per un semplice lettore QR sono sufficienti ZXing o ML Kit.

Quali formati di codici a barre supporta ML Kit?

ML Kit Barcode Scanning supporta 14 formati: 1D — EAN-8, EAN-13, UPC-A, UPC-E, Code 39, Code 93, Code 128, ITF, Codabar; 2D — QR Code, Data Matrix, PDF417, Aztec. È supportato anche GS1 DataBar (RSS-14, RSS-Expanded). L'elenco completo è nella documentazione Barcode.FORMAT_*. Per limitare i formati utilizzare setBarcodeFormats() — questo accelera la scansione di 2–3 volte.

Come accelerare la scansione dei codici a barre?

Ridurre la risoluzione della fotocamera a 480p (640x480), attivare la messa a fuoco automatica continua, limitare i formati a quelli necessari (setBarcodeFormats), utilizzare la modalità di prestazioni FAST. Per ML Kit specificare solo i formati necessari — escludere formati extra accelera la scansione di 2–3 volte. Per ZXing — utilizzare HybridBinarizer invece di GlobalHistogramBinarizer (20% più veloce). Per AVFoundation — specificare metadataObjectTypes.

La scansione dei codici a barre funziona senza internet?

Sì, tutti gli SDK locali di Barcode Scanning (ML Kit, ZXing, AVFoundation, Scandit) funzionano completamente offline. ML Kit richiede internet solo per il download iniziale del modello (modalità scaricata), dopodiché il modello viene memorizzato nella cache del dispositivo. AVFoundation è integrato in iOS, non richiede internet. ZXing è completamente offline senza Play Services. La scansione cloud (Google Cloud Vision) non viene utilizzata nelle app mobili.

È possibile scansionare codici a barre danneggiati o sfocati?

ML Kit e Scandit dispongono di una correzione integrata per i codici danneggiati grazie ad algoritmi di reti neurali. ML Kit ripristina fino al 30% di un codice danneggiato (graffi, strappi). Scandit — fino al 50% grazie all'addestramento su codici difettosi. ZXing praticamente non ripristina i codici danneggiati — richiede un'immagine nitida. Per scansionare codici difettosi utilizzare Scandit o ML Kit con la modalità di prestazioni ACCURATE.

Riepilogo

  • Barcode Scanning — rilevamento e decodifica di codici 1D/2D con la fotocamera dello smartphone
  • ML Kit — precisione 98,5%, multi-codice, rilevamento in qualsiasi parte dell'inquadratura, gratuito
  • ZXing — open-source, compatibile con qualsiasi dispositivo, precisione 92%
  • AVFoundation — scanner iOS nativo, integrato nel sistema (iOS 7+)
  • Scandit — SDK enterprise (99,5%), SparkScan, MatrixScan, da $400/mese
  • Ottimizzazione — risoluzione 480p, autofocus, limitazione dei formati, feedback aptico
  • Tutti i formati — EAN, UPC, QR, Data Matrix, PDF417, Aztec, Code 128

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche