Barcode Scanning in apps — wat het is, codetypen en ML Kit

Auteur: IT Sectr Gepubliceerd: 2026-07-18 Leestijd: 10 min

Barcode Scanning — is de technologie van het lezen en decoderen van barcodes met de camera van een mobiel apparaat. In tegenstelling tot laserscanners die gespecialiseerde apparatuur vereisen, werken camerascanners op elke smartphone met een camera. In mobiele ontwikkeling wordt Barcode Scanning geïmplementeerd via ML Kit Barcode Scanning (Google), AVFoundation (Apple), ZXing (open-source) of Scandit (commerciële SDK). Volgens Google ML Kit, 2025 verwerkt de bibliotheek 2+ miljard scans per dag met een nauwkeurigheid van 98.5%.

Belangrijkste

  • Barcode Scanning — het uitlezen van één- en tweedimensionale codes met de camera
  • ML Kit Barcode — de meest nauwkeurige SDK (98.5%), multi-code, alle formaten
  • Formaten — EAN, UPC, QR, Data Matrix, PDF417, Aztec, Code 128
  • Real-time — scannen tot 60 FPS met CameraX en AVFoundation
  • On-device — alle berekeningen lokaal, zonder internet

Wat is Barcode Scanning: principes en formaten

Barcode Scanning — het proces van optische herkenning van barcodes met behulp van een camera. Het algoritme legt een beeld vast, vindt de code erop (lokalisatie), decodeert deze (gegevensextractie) en retourneert een tekenreekswaarde. Moderne SDK's scannen codes van elke oriëntatie, grootte en bij elke belichting — de gebruiker hoeft alleen de camera te richten.

Barcodeformaten zijn onderverdeeld in twee groepen: 1D (lineair) — EAN-13, UPC-A, Code 128, Code 39, ITF, Codabar — bevatten tot 20–30 tekens, gebruikt voor producten, logistiek; 2D (matrix) — QR Code, Data Matrix, PDF417, Aztec — bevatten tot 3000+ tekens, gebruikt voor links, tickets, documenten. ML Kit ondersteunt 14 formaten — alle populaire 1D- en 2D-formaten.

Data Matrix — tweedimensionale code, vergelijkbaar met QR maar compacter. Gebruikt in de industrie (markering van onderdelen), elektronische tickets (IATA BCBP), medische monsters. Data Matrix kan tot 2335 tekens bevatten en wordt op zeer kleine oppervlakken aangebracht — tot 2x2 mm. In tegenstelling tot QR heeft Data Matrix geen zoekpatronen (vierkanten in de hoeken) en vereist een nauwkeurigere kalibratie van de camera.

FormaatTypeMax. gegevensToepassing
EAN-131D13 cijfersProducten in winkels
QR Code2D4296 tekensLinks, betalingen, tickets
Data Matrix2D2335 tekensIndustrie, geneeskunde
PDF4172D2710 tekensDocumenten, instapkaarten
Code 1281D80 tekensLogistiek, transport

QR Code — het populairste tweedimensionale formaat in mobiele apps. Bevat URL, tekst, vCard, WiFi-configuratie, betaalinformatie (UPI, SBP). QR Code heeft 40 versies (van 21x21 tot 177x177 modules) en 4 foutcorrectieniveaus (L: 7%, M: 15%, Q: 25%, H: 30%). Gebruik voor mobiele apps versies 2–10 (25x25 – 57x57 modules) — optimale balans tussen grootte en gegevens.

ML Kit Barcode Scanning: integratie en configuratie

ML Kit Barcode Scanning — de primaire SDK voor Android-apps. ML Kit vindt zelfstandig alle codes in een afbeelding (in tegenstelling tot ZXing, dat vereist dat de code in het midden staat). De API retourneert een Barcode-object met rawValue (tekstinhoud), formaat (codetype), boundingBox en cornerPoints (4 hoekpunten van de code). ML Kit ondersteunt single-scan (één frame) en continuous-scan (videostream).

Multi-codemodus — ML Kit kan meerdere codes op één afbeelding detecteren. Activeer via BarcodeScannerOptions.Builder(). In de multimodus wordt een lijst met Barcode geretourneerd. Gebruik voor inventarisatie (scannen van een partij producten), herkennen van meerdere QR-codes op een tafel. Standaard is multi-code uitgeschakeld — alleen inschakelen indien nodig, omdat dit het scannen met 20–30% vertraagt.

kotlin
// ML Kit Barcode Scanning multi-codemodus
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, TEKST, TELEFOON...
            val rawValue = barcode.rawValue
            val displayValue = barcode.displayValue
        }
    }

Formaatfiltering — verplichte optimalisatie. setBarcodeFormats() beperkt de formaten die ML Kit zal zoeken. Als de app alleen QR-codes scant — geef dan FORMAT_QR_CODE op. Dit versnelt het scannen met 2–3 keer door het uitsluiten van decoderingsalgoritmen voor andere formaten. Voor een winkel scanner — FORMAT_EAN_13 | FORMAT_UPC_A. Voor logistiek — FORMAT_CODE_128 | FORMAT_CODE_39 | FORMAT_PDF417.

ZXing vs ML Kit: bibliotheken vergelijken

ZXing (Zebra Crossing) — open-source bibliotheek in Java (Android) met ports naar Swift, React Native, Flutter. ZXing was de facto standaard voor scannen vóór de komst van ML Kit. Ondersteunt alle populaire formaten, werkt op elk apparaat (inclusief Huawei zonder Google Play), vereist geen Google Play Services. Nadelen: 2–3 keer langzamer dan ML Kit, vindt geen codes aan de rand van het frame, geen multi-code.

ML Kit vs ZXing — ML Kit wint op snelheid, nauwkeurigheid en UX. ML Kit detecteert een code zelfs als deze 10% van het frame beslaat en in de hoek zit. ZXing vereist dat de code 50–80% van het frame beslaat en in het midden staat. ML Kit gebruikt een neuraal netwerk (MobileNetV2-SSD) voor codepositionering, ZXing — klassieke binarisatie en zoekpatroonherkenning. Volgens Google (2025) biedt ML Kit 98.5% nauwkeurigheid tegenover 92% bij ZXing.

KenmerkML KitZXing
Nauwkeurigheid98.5%92%
Snelheid15–30 ms50–150 ms
Multi-codeJaNee
Google PlayVereistNiet vereist
Code in hoekDetecteertDetecteert niet

Wanneer ZXing kiezen: als de app moet werken op Huawei-apparaten (zonder Google Play Services), op Android Go (beperkt geheugen), of als volledige offline werking zonder Play Services nodig is. In alle andere gevallen — ML Kit is sneller, nauwkeuriger, eenvoudiger te integreren en biedt een betere UX dankzij multi-code en periferiedetectie.

kotlin
// ZXing Core: eenvoudige 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 niet gevonden
}

Scandit als alternatief — commerciële SDK met 99.5% nauwkeurigheid en 10–20 ms snelheid. Gebruikt eigen neurale netwerken en vereist geen Google Play Services. Prijs — vanaf $400/maand (2019). Scandit domineert in retail en logistiek (Walmart, FedEx). Voor de meeste mobiele apps is ML Kit voldoende — Scandit is alleen gerechtvaardigd voor enterprise-taken met high-volume scannen.

Apple AVFoundation: native scanner op iOS

Apple AVFoundation biedt native Barcode Scanning via AVCaptureMetadataOutput. Sinds iOS 7 ondersteunt AVFoundation het scannen van QR-codes, en vanaf iOS 8 — alle EAN-, UPC-, Code 128- en PDF417-formaten. AVFoundation vereist geen installatie van extra SDK's — het maakt deel uit van Foundation. Scannen werkt via Apple Neural Engine op A12+ — snelheid 10–20 ms met minimaal energieverbruik.

Voordelen van AVFoundation: nul afhankelijkheid, automatische verwerking van camera-orientatie, ingebouwde ondersteuning voor licht/donker-modus, werken op de achtergrond (met background modes). AVFoundation stelt automatisch autofocus en belichting in voor scannen — de ontwikkelaar hoeft alleen te abonneren op de captureOutput-delegate. Nadeel: minder instellingen dan in ML Kit — multi-code of formaatfilter kunnen niet worden ingeschakeld.

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 op iOS: ML Kit biedt meer controle — formaten configureren, multi-code inschakelen, codes filteren op confidence. AVFoundation is sneller op oudere apparaten (minder overhead) maar ondersteunt Data Matrix, Aztec, PDF417 niet op iOS < 15. Voor iOS 15+ heeft ML Kit de voorkeur. Voor iOS 12–14 gebruik AVFoundation + fallback naar ML Kit voor niet-ondersteunde formaten.

Scandit: commerciële oplossing voor enterprise

Scandit — commerciële SDK voor Barcode Scanning gericht op retail, logistiek en gezondheidszorg. Scandit gebruikt eigen neurale netwerken, getraind op 10+ miljoen barcode-afbeeldingen in verschillende omstandigheden: reflecties, beschadigingen, weinig licht, helling tot 45°, spiegelingen. Scandit scant codes op afstanden tot 15 meter (voor PDF417 in magazijnen) en op ronde oppervlakken (blikjes, flessen).

Scandit-mogelijkheden: SparkScan (single-scan voor snel sequentieel scannen), MatrixScan (multi-code + AR-markering van gescande items), PickList (product zoeken op barcode met bevestiging). Scandit ondersteunt 50+ formaten, waaronder GS1 DataBar en Composite Codes. Snelheid — 10–15 ms per code. Nauwkeurigheid — 99.5% bij standaard belichting, 97% bij weinig licht.

kotlin
// Scandit MatrixScan (SDK-licentie vereist)
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 is betaald ($400+/maand) maar biedt enterprise-functies: SparkScan (hardwareknop op bedrijfsapparatuur), MatrixScan (AR-overlay voor markering), PickList (spraakbevestiging). ML Kit is gratis en voldoende voor 90% van de mobiele apps: winkelscanners, QR-lezers, ticket-apps. Scandit is alleen gerechtvaardigd voor logistieke terminals met Zebra/Honeywell-apparaten.

Scanoptimalisatie: snelheid en nauwkeurigheid

Barcode Scanning optimalisatie omvat het configureren van camera, resolutie en SDK. Hoofdregel: minder pixels — sneller scannen. Voor ML Kit is de optimale resolutie 480p (640x480) voor video en 720p (1280x720) voor foto’s. Verhogen naar 1080p vertraagt verwerking met 2–3 keer zonder nauwkeurigheidswinst. Gebruik CameraX met ImageAnalysis voor automatisch resolutiebeheer.

Focus en belichting zijn kritisch voor de scan-kwaliteit. ML Kit stelt de camera niet automatisch in — de ontwikkelaar moet continuous auto-focus en continuous auto-exposure inschakelen via Camera2 of CameraX. Zonder autofocus verlagen wazige codes de nauwkeurigheid tot 60–70%. Voor scannen van dichtbij (5–15 cm) gebruik de macrostmodus van de camera indien beschikbaar.

Auto-zoom en richtlijnoverlay — UX-verbeteringen voor de gebruiker. Auto-zoom benadert de code wanneer deze wordt gedetecteerd (zoals in de Google Lens-camera). Gerealiseerd door analyse van de boundingBox van de code en schaling van de preview. Richtlijnoverlay — een grafisch kader dat aangeeft waar de camera gericht moet worden. Voor een betere UX toon de boundingBox van de gevonden code en markeer deze groen bij succesvol decoderen.

kotlin
// CameraX + ML Kit: geoptimaliseerde 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 {
                    // Haptisch + geluid + codemarkering
                }
            }
            .addOnCompleteListener { image.close() }
    }
}

Feedback aan de gebruiker: trilling (HapticFeedback), geluid (MediaActionSound), visuele markering (Canvas/Overlay). Voeg na een succesvolle scan een vertraging van 1000–1500 ms (throttling) toe vóór de volgende scan — dit voorkomt dubbele triggering op dezelfde code. Voor sequentieel scannen (scannen van een partij producten) gebruik de SparkScan-aanpak: elke scan wordt geregistreerd en hoorbaar gemaakt, vertraging 300–500 ms.

Veelgestelde vragen

Welke SDK voor barcodescannen is het beste op Android?

ML Kit Barcode Scanning — de beste keuze voor Android: gratis, 98.5% nauwkeurigheid, multi-code, detectie in elk deel van het frame. Als de app moet werken op Huawei-apparaten zonder Google Play — gebruik ZXing (open-source, lagere nauwkeurigheid). Voor enterprise-logistiek — Scandit (betaald, 99.5% nauwkeurigheid, SparkScan). Voor een eenvoudige QR-lezer zijn ZXing of ML Kit voldoende.

Welke barcodeformaten ondersteunt ML Kit?

ML Kit Barcode Scanning ondersteunt 14 formaten: 1D — EAN-8, EAN-13, UPC-A, UPC-E, Code 39, Code 93, Code 128, ITF, Codabar; 2D — QR Code, Data Matrix, PDF417, Aztec. Ook GS1 DataBar (RSS-14, RSS-Expanded) wordt ondersteund. Volledige lijst — in de Barcode.FORMAT_* documentatie. Gebruik setBarcodeFormats() om formaten te beperken — dit versnelt het scannen met 2–3 keer.

Hoe versnel ik het scannen van barcodes?

Verlaag de cameraresolutie naar 480p (640x480), schakel continuous auto-focus in, beperk formaten tot de benodigde (setBarcodeFormats), gebruik FAST performance-modus. Specificeer voor ML Kit alleen de noodzakelijke formaten — het uitsluiten van overbodige formaten versnelt het scannen met 2–3 keer. Voor ZXing — gebruik HybridBinarizer in plaats van GlobalHistogramBinarizer (20% sneller). Voor AVFoundation — specificeer metadataObjectTypes.

Werkt barcodescannen zonder internet?

Ja, alle lokale Barcode Scanning SDK's (ML Kit, ZXing, AVFoundation, Scandit) werken volledig offline. ML Kit heeft alleen internet nodig bij de eerste download van het model (downloaded-modus), waarna het model op het apparaat wordt gecachet. AVFoundation — ingebouwd in iOS, geen internet nodig. ZXing — volledig offline zonder Play Services. Cloud-scannen (Google Cloud Vision) wordt niet gebruikt in mobiele apps.

Kunnen beschadigde of wazige barcodes worden gescand?

ML Kit en Scandit hebben ingebouwde correctie voor beschadigde codes dankzij neurale netwerkalgoritmen. ML Kit herstelt tot 30% van een beschadigde code (krassen, scheuren). Scandit — tot 50% dankzij training op defecte codes. ZXing herstelt beschadigde codes praktisch niet — vereist een duidelijk beeld. Gebruik voor het scannen van defecte codes Scandit of ML Kit in ACCURATE performance-modus.

Samenvatting

  • Barcode Scanning — detectie en decodering van 1D/2D-codes met de smartphonecamera
  • ML Kit — 98.5% nauwkeurigheid, multi-code, detectie in elk deel van het frame, gratis
  • ZXing — open-source, compatibel met elk apparaat, 92% nauwkeurigheid
  • AVFoundation — native iOS-scanner, ingebouwd in het systeem (iOS 7+)
  • Scandit — enterprise SDK (99.5%), SparkScan, MatrixScan, vanaf $400/maand
  • Optimalisatie — 480p resolutie, autofocus, formaatbeperking, Haptic feedback
  • Alle formaten — EAN, UPC, QR, Data Matrix, PDF417, Aztec, Code 128

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook