Barcode Scanning — är tekniken för att läsa och avkoda streckkoder med hjälp av kameran på en mobil enhet. Till skillnad från laserskannrar som kräver specialiserad utrustning fungerar kameras skannrar på alla smarttelefoner med kamera. Inom mobil utveckling implementeras Barcode Scanning genom ML Kit Barcode Scanning (Google), AVFoundation (Apple), ZXing (open-source) eller Scandit (kommersiell SDK). Enligt Google ML Kit, 2025 bearbetar biblioteket 2+ miljarder skanningar per dag med 98.5% noggrannhet.
Huvudpunkter
Barcode Scanning — processen för optisk igenkänning av streckkoder med hjälp av kamera. Algoritmen tar en bild, hittar koden på den (lokalisering), avkodar den (dataextraktion) och returnerar ett strängvärde. Moderna SDK:er skannar koder oavsett orientering, storlek och belysning — användaren behöver bara rikta kameran.
Streckkodsformat delas in i två grupper: 1D (linjära) — EAN-13, UPC-A, Code 128, Code 39, ITF, Codabar — innehåller upp till 20–30 tecken, används för varor, logistik; 2D (matris) — QR Code, Data Matrix, PDF417, Aztec — innehåller upp till 3000+ tecken, används för länkar, biljetter, dokument. ML Kit stödjer 14 format — alla populära 1D- och 2D-format.
Data Matrix — tvådimensionell kod, liknar QR men mer kompakt. Används inom industrin (märkning av delar), elektroniska biljetter (IATA BCBP), medicinska prover. Data Matrix kan innehålla upp till 2335 tecken och appliceras på mycket små ytor — upp till 2x2 mm. Till skillnad från QR har Data Matrix inga sökmönster (kvadrater i hörnen) och kräver mer exakt kamera kalibrering.
| Format | Typ | Max. data | Användning |
|---|---|---|---|
| EAN-13 | 1D | 13 siffror | Varor i butiker |
| QR Code | 2D | 4296 tecken | Länkar, betalningar, biljetter |
| Data Matrix | 2D | 2335 tecken | Industri, medicin |
| PDF417 | 2D | 2710 tecken | Dokument, boardingkort |
| Code 128 | 1D | 80 tecken | Logistik, transport |
QR Code — det populäraste tvådimensionella formatet i mobila appar. Innehåller URL, text, vCard, WiFi-konfiguration, betalningsinformation (UPI, SBP). QR Code har 40 versioner (från 21x21 till 177x177 moduler) och 4 felkorrigeringsnivåer (L: 7%, M: 15%, Q: 25%, H: 30%). För mobila appar, använd version 2–10 (25x25 – 57x57 moduler) — optimal balans mellan storlek och data.
ML Kit Barcode Scanning — det primära SDK:t för Android-appar. ML Kit hittar självständigt alla koder på en bild (till skillnad från ZXing som kräver att koden är i mitten). API:et returnerar ett Barcode-objekt med rawValue (textinnehåll), format (kodtyp), boundingBox och cornerPoints (4 hörnpunkter på koden). ML Kit stödjer single-scan (en bildruta) och continuous-scan (videoström).
Multi-kodläge — ML Kit kan upptäcka flera koder på en enda bild. Aktivera via BarcodeScannerOptions.Builder(). I multi-läge returneras en lista med Barcode. Använd för inventering (skanning av ett parti varor), igenkänning av flera QR-koder på ett bord. Som standard är multi-kod avaktiverat — aktivera endast vid behov, eftersom det saktar ner skanningen med 20–30%.
// ML Kit Barcode Scanning multi-kodläge
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
}
}
Formatsfiltering — obligatorisk optimering. setBarcodeFormats() begränsar de format som ML Kit kommer att söka efter. Om appen endast skannar QR-koder — ange FORMAT_QR_CODE. Detta snabbar upp skanningen 2–3 gånger genom att utesluta avkodningsalgoritmer för andra format. För butiksskanner — FORMAT_EAN_13 | FORMAT_UPC_A. För logistik — FORMAT_CODE_128 | FORMAT_CODE_39 | FORMAT_PDF417.
ZXing (Zebra Crossing) — nyílt forráskódú bibliotek Java nyelven (Android) Swift, React Native, Flutter portokkal. A ZXing volt a de facto szabvány a szkennelésben az ML Kit megjelenése előtt. Támogatja az összes népszerű formátumot, bármely eszközön műkodik (beleértve a Google Play nélküli Huawei-t is), nem igényel Google Play Services-t. Hátrányok: 2–3-szor lassabb mint az ML Kit, nem találja a kódokat a kép szélén, nincs multi-kod támogatás.
\nML Kit vs ZXing — az ML Kit gyorsaságban, pontosságban és UX-ben is felülmúlja a ZXinget. Az ML Kit akkor is érzékeli a kódot, ha az csak a kép 10%-át foglalja el és a sarokban van. A ZXing megköveteli, hogy a kód a kép 50–80%-át foglalja el és középen legyen. Az ML Kit neurális hálózatot (MobileNetV2-SSD) használ a kód lokalizálásához, a ZXing klasszikus binarizációt és keresőminta-keresést. A Google (2025) szerint az ML Kit 98.5%-os pontosságot nyújt a ZXing 92%-ával szemben.
\n\n| Jellemző | ML Kit | ZXing |
|---|---|---|
| Pontosság | 98.5% | 92% |
| Sebesség | 15–30 ms | 50–150 ms |
| Többkód | Igen | Nem |
| Google Play | Szükséges | Nem szükséges |
| Kód a sarokban | Érzékeli | Nem érzékeli |
Mikor válassza a ZXinget: ha az alkalmazásnak Huawei eszközökön (Google Play Services nélkül), Android Go-n (korlátozott memória) kell műkodnie, vagy ha teljes offline műkodés szükséges Play Services nélkül. Minden más esetben — az ML Kit gyorsabb, pontosabb, egyszerűbben integrálható és jobb UX-et nyújt a multi-kodnak és periféria érzékelésnek köszönhetően.
\n\n// ZXing Core: enkel skanner
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) {
// Koden hittades inte
}\nScandit mint alternatíva — kereskedelmi SDK 99.5%-os pontossággal és 10–20 ms sebességgel. Saját neurális hálózatokat használ és nem igényel Google Play Services-t. Ár — $400/hónaptól (2019). A Scandit dominál a kiskereskedelemben és a logisztikában (Walmart, FedEx). A legtöbb mobilalkalmazáshoz az ML Kit elegendő — a Scandit csak nagy volumenű vállalati szkennelési feladatokhoz indokolt.
\nApple AVFoundation natív Barcode Scanning-et biztosít az AVCaptureMetadataOutput segítségével. Az iOS 7-től kezdve az AVFoundation támogatja a QR-kódok szkennelését, iOS 8-tól pedig az összes EAN, UPC, Code 128, PDF417 formátumot. Az AVFoundation nem igényel további SDK-k telepítését — a Foundation része. A szkennelés az Apple Neural Engine-en keresztül műkodik A12+ processzorokon — sebesség 10–20 ms minimális energiafogyasztással.
\nAVFoundation előnyei: nulla függőség, automatikus kamera tájolás kezelés, beépített világos/sötét mód támogatás, háttérben történő műkodés (background modes). Az AVFoundation automatikusan beállítja az autofókuszt és az expozíciót a szkenneléshez — a fejlesztőnek csak a captureOutput delegáltra kell feliratkoznia. Hátrány: kevesebb beállítás mint az ML Kit-ben — nem kapcsolható be a multi-kod vagy a formátumszűrő.
\n\nimport 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 ?? "")
}
}\nML Kit vs AVFoundation iOS-en: Az ML Kit több vezérlést biztosít — konfigurálhatók a formátumok, bekapcsolható a multi-kod, szűrhetők a kódok confidence alapján. Az AVFoundation gyorsabb régebbi eszközökön (kevesebb többletterhelés) de nem támogatja a Data Matrix, Aztec, PDF417 formátumokat iOS < 15 esetén. iOS 15+ esetén az ML Kit ajánlott. iOS 12–14 esetén használja az AVFoundation + visszaesést ML Kit-re a nem támogatott formátumokhoz.
\nScandit — kereskedelmi SDK Barcode Scanning-hez, kiskereskedelemre, logisztikára és egészségügyre fókuszálva. A Scandit saját neurális hálózatokat használ, amelyeket 10+ millió vonalkód képen tanítottak különböző körülmények között: tükröződés, sérülés, gyenge megvilágítás, 45°-os dőlésig, visszaverődés. A Scandit akár 15 méteres távolságból is szkenneli a kódokat (PDF417 raktárakban) és kerek felületeken (dobozok, palackok).
\nScandit képességek: SparkScan (single-scan gyors egymás utáni szkenneléshez), MatrixScan (multi-kód + AR kiemelés a beolvasottakhoz), PickList (termék keresése vonalkóddal megerősítéssel). A Scandit 50+ formátumot támogat, beleértve a GS1 DataBar és Composite Codes formátumokat. Sebesség — 10–15 ms kódonként. Pontosság — 99.5% normál megvilágításnál, 97% gyenge fénynél.
\n\n// Scandit MatrixScan (SDK-licens krävs)
val barcodeTracking = BarcodeTracking
.forDataCaptureContext(context)
.addListener(this)
.build()
barcodeTracking.addSessionListener { session, _ ->
session.trackedBarcodes.forEach { (trackingId, barcode) ->
val data = barcode.data
val symbolCount = barcode.symbolCount
}
}\nScandit vs ML Kit: A Scandit fizetős ($400+/hónap), de vállalati funkciókat kínál: SparkScan (hardver gomb vállalati eszközökön), MatrixScan (AR átfedés kiemeléshez), PickList (hangos megerősítés). Az ML Kit ingyenes és elegendő a mobilalkalmazások 90%-a számára: bolt szkennerek, QR olvasók, jegy alkalmazások. A Scandit csak Zebra/Honeywell eszközökkel rendelkező logisztikai terminálokhoz indokolt.
\nBarcode Scanning optimalizálása magában foglalja a kamera, felbontás és SDK konfigurálását. Fő szabály: kevesebb pixel — gyorsabb szkennelés. ML Kit esetén az optimális felbontás 480p (640x480) videóhoz és 720p (1280x720) fényképekhez. 1080p-re növelés 2–3-szor lassítja a feldolgozást a pontosság növelése nélkül. Használja a CameraX-et ImageAnalysis-szel az automatikus felbontáskezeléshez.
\nFókusz és expozíció kritikus a szkennelés minőségéhez. Az ML Kit nem állítja be automatikusan a kamerát — a fejlesztőnek be kell kapcsolnia a continuous auto-focus és continuous auto-exposure funkciókat a Camera2 vagy CameraX segítségével. Autofókusz nélkül az elmosódott kódok 60–70%-ra csökkentik a pontosságot. Közeli távolságból (5–15 cm) történő szkenneléshez használja a kamera makró módját, ha elérhető.
\nAuto-zoom és irányút átfedés — UX javítások a felhasználó számára. Az auto-zoom közelíti a kódot annak érzékelésekor (mint a Google Lens kamerában). A kód boundingBox-jának elemzésével és az előnézet méretezésével valósul meg. Az irányút átfedés — grafikus keret, amely megmutatja, hova kell irányítani a kamerát. Jobb UX érdekében jelenítse meg a talált kód boundingBox-ját és emelje ki zölddel sikeres dekódolás után.
\n\n// CameraX + ML Kit: optimerad skanner
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 {
// Haptik + ljud + kodmarkering
}
}
.addOnCompleteListener { image.close() }
}
}\nVisszajelzés a felhasználónak: rezgés (HapticFeedback), hang (MediaActionSound), vizuális kiemelés (Canvas/Overlay). Sikeres szkennelés után adjon hozzá 1000–1500 ms késleltetést (throttling) a következő szkennelés előtt — ez megakadályozza a többszörös aktiválódást ugyanazon a kódon. Szekvenciális szkenneléshez (árukészlet szkennelése) használja a SparkScan módszert: minden szkennelés rögzítésre kerül és hangjelzéssel történik, késleltetés 300–500 ms.
\nGyakori kérdések
\nML Kit Barcode Scanning — a legjobb választás Androidhoz: ingyenes, 98.5% pontosság, multi-kod, érzékelés a kép bármely részén. Ha az alkalmazásnak Google Play nélküli Huawei eszközökön kell műkodnie — használja a ZXinget (nyílt forrás, alacsonyabb pontosság). Vállalati logisztikához — Scandit (fizetős, 99.5% pontosság, SparkScan). Egyszerű QR olvasóhoz elegendő a ZXing vagy az ML Kit.
\nML Kit Barcode Scanning 14 formátumot támogat: 1D — EAN-8, EAN-13, UPC-A, UPC-E, Code 39, Code 93, Code 128, ITF, Codabar; 2D — QR Code, Data Matrix, PDF417, Aztec. Továbbá támogatja a GS1 DataBart (RSS-14, RSS-Expanded). Teljes lista — a Barcode.FORMAT_* dokumentációban. A formátumok korlátozásához használja a setBarcodeFormats() függvényt — ez 2–3-szor felgyorsítja a szkennelést.
\nCsökkentse a kamera felbontását 480p-re (640x480), kapcsolja be a continuous auto-focus-t, korlátozza a formátumokat a szükségesekre (setBarcodeFormats), használja a FAST performance módot. ML Kit esetén csak a szükséges formátumokat adja meg — a felesleges formátumok kizárása 2–3-szor felgyorsítja a szkennelést. ZXing esetén használja a HybridBinarizer-t a GlobalHistogramBinarizer helyett (20%-kal gyorsabb). AVFoundation esetén adja meg a metadataObjectTypes-t.
\nIgen, az összes helyi Barcode Scanning SDK (ML Kit, ZXing, AVFoundation, Scandit) teljesen offline műkodik. Az ML Kit csak a modell első letöltésekor igényel internetet (letöltött mód), ezután a modell a gyorsítótárban tárolódik az eszközön. AVFoundation — beépítve iOS-be, nem igényel internetet. ZXing — teljesen offline Play Services nélkül. Felhőalapú szkennelés (Google Cloud Vision) nem használatos mobil alkalmazásokban.
\nAz ML Kit és a Scandit beépített korrekcióval rendelkezik a sérült kódokhoz a neurális hálózati algoritmusoknak köszönhetően. Az ML Kit a sérült kód akár 30%-_t is helyreállítja (karcolások, szakadások). A Scandit — akár 50%-ot a hibás kódokon végzett tanításnak köszönhetően. A ZXing gyakorlatilag nem állítja helyre a sérült kódokat — tiszta képet igényel. Hibás kódok szkenneléséhez használja a Scandit-ot vagy az ML Kit-et ACCURATE performance módban.
\nÖsszefoglalás
\nVi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också