Barcode Scanning w aplikacjach — co to jest, typy kodów i ML Kit

Autor: IT Sectr Opublikowano: 2026-07-18 Czas czytania: 10 min

Barcode Scanning — to technologia odczytu i dekodowania kodów kreskowych za pomocą aparatu urządzenia mobilnego. W przeciwieństwie do skanerów laserowych, które wymagają specjalistycznego sprzętu, skanery kamerowe działają na każdym smartfonie z aparatem. W programowaniu mobilnym Barcode Scanning jest implementowany przez ML Kit Barcode Scanning (Google), AVFoundation (Apple), ZXing (open-source) lub Scandit (komercyjny SDK). Według Google ML Kit, 2025, biblioteka przetwarza 2+ miliardy skanów dziennie z dokładnością 98.5%.

Najważniejsze

  • Barcode Scanning — odczyt kodów jedno- i dwuwymiarowych kamerą
  • ML Kit Barcode — najdokładniejszy SDK (98.5%), multi-kod, wszystkie formaty
  • Formaty — EAN, UPC, QR, Data Matrix, PDF417, Aztec, Code 128
  • Real-time — skanowanie do 60 FPS z CameraX i AVFoundation
  • On-device — wszystkie obliczenia lokalnie, bez internetu

Co to jest Barcode Scanning: zasady i formaty

Barcode Scanning — proces optycznego rozpoznawania kodów kreskowych za pomocą aparatu. Algorytm przechwytuje obraz, znajduje na nim kod (lokalizacja), dekoduje go (wyodrębnianie danych) i zwraca wartość ciągu znaków. Nowoczesne SDK skanują kody o dowolnej orientacji, rozmiarze i przy każdym oświetleniu — wystarczy, że użytkownik skieruje kamerę.

Formaty kodów kreskowych dzielą się na dwie grupy: 1D (liniowe) — EAN-13, UPC-A, Code 128, Code 39, ITF, Codabar — zawierają do 20–30 znaków, używane do towarów, logistyki; 2D (matrycowe) — QR Code, Data Matrix, PDF417, Aztec — zawierają do 3000+ znaków, używane do linków, biletów, dokumentów. ML Kit obsługuje 14 formatów — wszystkie popularne 1D i 2D.

Data Matrix — kod dwuwymiarowy, podobny do QR, ale bardziej kompaktowy. Używany w przemyśle (znakowanie części), biletach elektronicznych (IATA BCBP), próbkach medycznych. Data Matrix może zawierać do 2335 znaków i jest nanoszony na bardzo małe powierzchnie — do 2x2 mm. W przeciwieństwie do QR, Data Matrix nie ma wzorców wyszukiwania (kwadraty w rogach) i wymaga dokładniejszej kalibracji aparatu.

FormatTypMaks. danychZastosowanie
EAN-131D13 cyfrTowary w sklepach
QR Code2D4296 znakówLinki, płatności, bilety
Data Matrix2D2335 znakówPrzemysł, medycyna
PDF4172D2710 znakówDokumenty, karty pokładowe
Code 1281D80 znakówLogistyka, transport

QR Code — najpopularniejszy format dwuwymiarowy w aplikacjach mobilnych. Zawiera URL, tekst, vCard, konfigurację WiFi, informacje płatnicze (UPI, SBP). QR Code ma 40 wersji (od 21x21 do 177x177 modułów) i 4 poziomy korekcji błędów (L: 7%, M: 15%, Q: 25%, H: 30%). Dla aplikacji mobilnych używaj wersji 2–10 (25x25 – 57x57 modułów) — optymalny balans rozmiaru i danych.

ML Kit Barcode Scanning: integracja i konfiguracja

ML Kit Barcode Scanning — główny SDK dla aplikacji Android. ML Kit samodzielnie znajduje wszystkie kody na obrazie (w przeciwieństwie do ZXing, który wymaga, aby kod był w centrum). API zwraca obiekt Barcode z rawValue (treść tekstowa), format (typ kodu), boundingBox i cornerPoints (4 punkty narożników kodu). ML Kit obsługuje single-scan (jedna klatka) i continuous-scan (strumień wideo).

Tryb multi-kodów — ML Kit może wykrywać wiele kodów na jednym obrazie. Włącz przez BarcodeScannerOptions.Builder(). W trybie multi zwracana jest lista Barcode. Używaj do inwentaryzacji (skanowanie partii towarów), rozpoznawania wielu kodów QR na stole. Domyślnie multi-kod jest wyłączony — włącz tylko w razie potrzeby, ponieważ spowalnia to skanowanie o 20–30%.

kotlin
// Tryb multikodów 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, TEKST, TELEFON...
            val rawValue = barcode.rawValue
            val displayValue = barcode.displayValue
        }
    }

Filtracja formatów — obowiązkowa optymalizacja. setBarcodeFormats() ogranicza formaty, których ML Kit będzie szukał. Jeśli aplikacja skanuje tylko kody QR — podaj FORMAT_QR_CODE. To przyspiesza skanowanie 2–3 razy poprzez wyłączenie algorytmów dekodowania innych formatów. Dla skanera sklepowego — FORMAT_EAN_13 | FORMAT_UPC_A. Dla logistyki — FORMAT_CODE_128 | FORMAT_CODE_39 | FORMAT_PDF417.

ZXing vs ML Kit: porównanie bibliotek

ZXing (Zebra Crossing) — biblioteka open-source w Javie (Android) z portami na Swift, React Native, Flutter. ZXing to de facto standard skanowania przed pojawieniem się ML Kit. Obsługuje wszystkie popularne formaty, działa na każdym urządzeniu (w tym Huawei bez Google Play), nie wymaga Google Play Services. Wady: wolniejszy od ML Kit 2–3 razy, nie znajduje kodów na peryferiach kadru, brak multi-kodów.

ML Kit vs ZXing — ML Kit wygrywa pod względem szybkości, dokładności i UX. ML Kit wykrywa kod nawet jeśli zajmuje 10% kadru i znajduje się w rogu. ZXing wymaga, aby kod zajmował 50–80% kadru i był w centrum. ML Kit używa sieci neuronowej (MobileNetV2-SSD) do lokalizacji kodu, ZXing — klasycznej binaryzacji i wyszukiwania wzorców. Według Google (2025), ML Kit daje 98.5% dokładności wobec 92% u ZXing.

CechaML KitZXing
Dokładność98.5%92%
Szybkość15–30 ms50–150 ms
Multi-kodTakNie
Google PlayWymaganyNiewymagany
Kod w roguWykrywaNie wykrywa

Kiedy wybrać ZXing: jeśli aplikacja ma działać na urządzeniach Huawei (bez Google Play Services), na Android Go (ograniczona pamięć), lub jeśli potrzebna jest pełna praca offline bez Play Services. We wszystkich innych przypadkach — ML Kit jest szybszy, dokładniejszy, prostszy w integracji i zapewnia lepszy UX dzięki multi-kodom i detekcji na peryferiach.

kotlin
// ZXing Core: prosty skaner
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) {
    // Nie znaleziono kodu
}

Scandit jako alternatywa — komercyjny SDK z dokładnością 99.5% i szybkością 10–20 ms. Używa własnych sieci neuronowych i nie wymaga Google Play Services. Cena — od $400/miesiąc (2019). Scandit dominuje w handlu detalicznym i logistyce (Walmart, FedEx). Dla większości aplikacji mobilnych ML Kit wystarczy — Scandit jest uzasadniony tylko dla zadań enterprise z high-volume skanowaniem.

Apple AVFoundation: natywny skaner na iOS

Apple AVFoundation udostępnia natywne Barcode Scanning przez AVCaptureMetadataOutput. Od iOS 7 AVFoundation obsługuje skanowanie kodów QR, a od iOS 8 — wszystkie formaty EAN, UPC, Code 128, PDF417. AVFoundation nie wymaga instalacji dodatkowych SDK — jest częścią Foundation. Skanowanie działa poprzez Apple Neural Engine na A12+ — szybkość 10–20 ms z minimalnym poborem energii.

Zalety AVFoundation: zerowa zależność, automatyczna obsługa orientacji aparatu, wbudowana obsługa trybu jasnego/ciemnego, działanie w tle (z background modes). AVFoundation automatycznie ustawia autofokus i ekspozycję pod skanowanie — programista musi tylko subskrybować delegata captureOutput. Wada: mniej ustawień niż w ML Kit — nie można włączyć multi-kodów ani filtra formatów.

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 na iOS: ML Kit daje więcej kontroli — można skonfigurować formaty, włączyć multi-kody, odfiltrować kody według confidence. AVFoundation — szybszy na starszych urządzeniach (mniejszy narzut), ale nie obsługuje Data Matrix, Aztec, PDF417 na iOS < 15. Dla iOS 15+ ML Kit jest preferowany. Dla iOS 12–14 używaj AVFoundation + fallback na ML Kit dla nieobsługiwanych formatów.

Scandit: komercyjne rozwiązanie dla enterprise

Scandit — komercyjny SDK do Barcode Scanning z naciskiem na handel detaliczny, logistykę i opiekę zdrowotną. Scandit używa własnych sieci neuronowych, wytrenowanych na 10+ milionach obrazów kodów kreskowych w różnych warunkach: odblaski, uszkodzenia, słabe oświetlenie, nachylenie do 45°, odbicia. Scandit skanuje kody z odległości do 15 metrów (dla PDF417 w magazynach) i na okrągłych powierzchniach (puszki, butelki).

Możliwości Scandit: SparkScan (single-scan do szybkiego skanowania sekwencyjnego), MatrixScan (multi-kod + AR podświetlenie zeskanowanych), PickList (wyszukiwanie towaru po kodzie kreskowym z potwierdzeniem). Scandit obsługuje 50+ formatów, w tym GS1 DataBar i Composite Codes. Szybkość — 10–15 ms na kod. Dokładność — 99.5% przy standardowym oświetleniu, 97% przy słabym.

kotlin
// Scandit MatrixScan (wymagana licencja SDK)
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 jest płatny ($400+/miesiąc), ale oferuje enterprise-funkcje: SparkScan (przycisk sprzętowy na urządzeniach korporacyjnych), MatrixScan (nakładka AR do podświetlania), PickList (potwierdzenie głosowe). ML Kit jest darmowy i wystarczający dla 90% aplikacji mobilnych: skanery sklepowe, czytniki QR, aplikacje biletowe. Scandit jest uzasadniony tylko dla terminali logistycznych z urządzeniami Zebra/Honeywell.

Optymalizacja skanowania: szybkość i dokładność

Optymalizacja Barcode Scanning obejmuje konfigurację aparatu, rozdzielczości i SDK. Główna zasada: mniej pikseli — szybsze skanowanie. Dla ML Kit optymalna rozdzielczość to 480p (640x480) dla wideo i 720p (1280x720) dla zdjęć. Zwiększenie do 1080p spowalnia przetwarzanie 2–3 razy bez wzrostu dokładności. Używaj CameraX z ImageAnalysis do automatycznego zarządzania rozdzielczością.

Ostrość i ekspozycja są krytyczne dla jakości skanowania. ML Kit nie ustawia aparatu automatycznie — programista musi włączyć continuous auto-focus i continuous auto-exposure przez Camera2 lub CameraX. Bez autofokusa rozmyte kody obniżają dokładność do 60–70%. Dla skanowania z bliskiej odległości (5–15 cm) używaj trybu makro aparatu, jeśli jest dostępny.

Auto-zoom i nakładka celownika — ulepszenia UX dla użytkownika. Auto-zoom przybliża kod po jego wykryciu (jak w aparacie Google Lens). Realizowany przez analizę boundingBox kodu i skalowanie podglądu. Nakładka celownika — graficzna ramka pokazująca, gdzie kierować aparat. Dla lepszego UX pokazuj boundingBox znalezionego kodu i podświetlaj go na zielono po udanym dekodowaniu.

kotlin
// CameraX + ML Kit: zoptymalizowany skaner
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 {
                    // Haptyka + dźwięk + podświetlenie kodu
                }
            }
            .addOnCompleteListener { image.close() }
    }
}

Feedback dla użytkownika: wibracja (HapticFeedback), dźwięk (MediaActionSound), wizualne podświetlenie (Canvas/Overlay). Po udanym skanowaniu dodaj opóźnienie 1000–1500 ms (throttling) przed następnym skanem — zapobiega to duplikowaniu się odczytów na jednym kodzie. Dla skanowania sekwencyjnego (skanowanie partii towarów) używaj podejścia SparkScan: każdy skan jest rejestrowany i sygnalizowany dźwiękiem, opóźnienie 300–500 ms.

Często zadawane pytania

Jaki SDK do skanowania kodów kreskowych jest najlepszy na Android?

ML Kit Barcode Scanning — najlepszy wybór dla Androida: darmowy, 98.5% dokładności, multi-kod, detekcja w każdej części kadru. Jeśli aplikacja ma działać na urządzeniach Huawei bez Google Play — używaj ZXing (open-source, niższa dokładność). Dla enterprise-logistyki — Scandit (płatny, 99.5% dokładności, SparkScan). Do prostego czytnika QR wystarczy ZXing lub ML Kit.

Jakie formaty kodów kreskowych obsługuje ML Kit?

ML Kit Barcode Scanning obsługuje 14 formatów: 1D — EAN-8, EAN-13, UPC-A, UPC-E, Code 39, Code 93, Code 128, ITF, Codabar; 2D — QR Code, Data Matrix, PDF417, Aztec. Obsługiwany jest również GS1 DataBar (RSS-14, RSS-Expanded). Pełna lista — w dokumentacji Barcode.FORMAT_*. Do ograniczenia formatów używaj setBarcodeFormats() — to przyspiesza skanowanie 2–3 razy.

Jak przyspieszyć skanowanie kodów kreskowych?

Zmniejsz rozdzielczość aparatu do 480p (640x480), włącz continuous auto-focus, ogranicz formaty do potrzebnych (setBarcodeFormats), używaj trybu FAST performance. Dla ML Kit podaj tylko niezbędne formaty — wyłączenie zbędnych formatów przyspiesza skanowanie 2–3 razy. Dla ZXing — używaj HybridBinarizer zamiast GlobalHistogramBinarizer (szybszy o 20%). Dla AVFoundation — podaj metadataObjectTypes.

Czy skanowanie kodów kreskowych działa bez internetu?

Tak, wszystkie lokalne SDK do Barcode Scanning (ML Kit, ZXing, AVFoundation, Scandit) działają w pełni offline. ML Kit wymaga internetu tylko przy pierwszym pobraniu modelu (tryb downloaded), po czym model jest buforowany na urządzeniu. AVFoundation — wbudowany w iOS, nie wymaga internetu. ZXing — w pełni offline bez Play Services. Skanowanie w chmurze (Google Cloud Vision) nie jest używane w aplikacjach mobilnych.

Czy można skanować uszkodzone lub rozmyte kody kreskowe?

ML Kit i Scandit mają wbudowaną korekcję uszkodzonych kodów dzięki algorytmom sieci neuronowych. ML Kit odtwarza do 30% uszkodzonego kodu (zarysowania, rozdarcia). Scandit — do 50% dzięki trenowaniu na wadliwych kodach. ZXing praktycznie nie odtwarza uszkodzonych kodów — wymaga wyraźnego obrazu. Do skanowania wadliwych kodów używaj Scandit lub ML Kit z trybem ACCURATE performance.

Podsumowanie

  • Barcode Scanning — detekcja i dekodowanie kodów 1D/2D kamerą smartfona
  • ML Kit — 98.5% dokładności, multi-kod, detekcja w każdej części kadru, darmowy
  • ZXing — open-source, zgodność z każdym urządzeniem, 92% dokładności
  • AVFoundation — natywny skaner iOS, wbudowany w system (iOS 7+)
  • Scandit — enterprise SDK (99.5%), SparkScan, MatrixScan, od $400/miesiąc
  • Optymalizacja — rozdzielczość 480p, autofokus, ograniczenie formatów, Haptic feedback
  • Wszystkie formaty — EAN, UPC, QR, Data Matrix, PDF417, Aztec, Code 128

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również