Barcode Scanning — технология за разчитане и декодиране на баркодове чрез камерата на мобилното устройство. За разлика от laser-скенерите, които изискват специализирано оборудване, камерните скенери работят на всеки смартфон с камера. В мобилната разработка Barcode Scanning се реализира чрез ML Kit Barcode Scanning (Google), AVFoundation (Apple), ZXing (open-source) или Scandit (търговски SDK). Според данните на Google ML Kit, 2025, библиотеката обработва 2+ милиарда сканирания на ден с точност 98.5%.
Основни положения
Barcode Scanning — процес на оптично разпознаване на баркодове с помощта на камера. Алгоритъмът заснема изображението, намира в него кода (локализация), декодира го (извличане на данни) и връща стойност от тип низ. Съвременните SDK сканират кодове във всяка ориентация, размер и при всякакво осветление — достатъчно е потребителят да насочи камерата.
Формати на баркодовете се делят на две групи: 1D (линейни) — EAN-13, UPC-A, Code 128, Code 39, ITF, Codabar — съдържат до 20–30 знака, използват се за стоки, логистика; 2D (матрични) — QR Code, Data Matrix, PDF417, Aztec — съдържат до 3000+ знака, използват се за връзки, билети, документи. ML Kit поддържа 14 формата — всички разпространени 1D и 2D.
Data Matrix — двумерен код, подобен на QR, но по-компактен. Използва се в промишлеността (маркиране на детайли), електронни билети (IATA BCBP), медицински проби. Data Matrix може да съдържа до 2335 знака и се нанася върху много малки повърхности — до 2x2 мм. За разлика от QR, Data Matrix няма finder patterns (квадрати в ъглите) и изисква по-точна калибровка на камерата.
| Формат | Тип | Макс. данни | Приложение |
|---|---|---|---|
| EAN-13 | 1D | 13 цифри | Стоки в магазините |
| QR Code | 2D | 4296 знака | Връзки, плащания, билети |
| Data Matrix | 2D | 2335 знака | Промишленост, медицина |
| PDF417 | 2D | 2710 знака | Документи, бордови карти |
| Code 128 | 1D | 80 знака | Логистика, транспорт |
QR Code — най-популярният двумерен формат в мобилните приложения. Съдържа URL, текст, vCard, WiFi конфигурация, платежна информация (UPI, SBP). QR Code има 40 версии (от 21x21 до 177x177 модула) и 4 нива на корекция на грешки (L: 7%, M: 15%, Q: 25%, H: 30%). За мобилни приложения използвайте версия 2–10 (25x25 – 57x57 модула) — оптимален баланс между размер и данни.
ML Kit Barcode Scanning — основен SDK за Android приложения. ML Kit самостоятелно намира всички кодове в изображението (за разлика от ZXing, който изисква кодът да е в центъра). API връща Barcode обект с rawValue (текстово съдържание), format (тип на кода), boundingBox и cornerPoints (4 точки на ъглите на кода). ML Kit поддържа single-scan (един кадър) и continuous-scan (видео поток).
Multi-barcode mode — ML Kit може да открива няколко кода в едно изображение. Включете чрез BarcodeScannerOptions.Builder(). В мулти режим се връща списък от Barcode. Използвайте за инвентаризация (сканиране на пакет стоки), разпознаване на няколко QR кода на маса. По подразбиране multi-barcode е изключен — включете само ако е нужно, защото забавя сканирането с 20–30%.
// 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, PHONE...
val rawValue = barcode.rawValue
val displayValue = barcode.displayValue
}
}
Филтриране на формати — задължителна оптимизация. setBarcodeFormats() ограничава форматите, които ML Kit ще търси. Ако приложението сканира само QR кодове — посочете FORMAT_QR_CODE. Това ускорява сканирането 2–3 пъти чрез изключване на алгоритмите за декодиране на други формати. За търговски скенер — FORMAT_EAN_13 | FORMAT_UPC_A. За логистика — FORMAT_CODE_128 | FORMAT_CODE_39 | FORMAT_PDF417.
ZXing (Zebra Crossing) — open-source библиотека на Java (Android) с портове за Swift, React Native, Flutter. ZXing — де факто стандарт за сканиране преди появата на ML Kit. Поддържа всички популярни формати, работи на всяко устройство (включително Huawei без Google Play), не изисква Google Play Services. Недостатъци: 2–3 пъти по-бавен от ML Kit, не намира кодове в периферията на кадъра, няма multi-barcode.
ML Kit vs ZXing — ML Kit печели по скорост, точност и UX. ML Kit открива кода дори ако заема 10% от кадъра и е в ъгъла. ZXing изисква кодът да заема 50–80% от кадъра и да е в центъра. ML Kit използва невронна мрежа (MobileNetV2-SSD) за локализация на кода, ZXing — класическа бинаризация и търсене на finder patterns. Според данните на Google (2025), ML Kit дава 98.5% точност срещу 92% при ZXing.
| Характеристика | ML Kit | ZXing |
|---|---|---|
| Точност | 98.5% | 92% |
| Скорост | 15–30 мс | 50–150 мс |
| Мулти-код | Да | Не |
| Google Play | Изисква се | Не се изисква |
| Код в ъгъла | Открива | Не открива |
Кога да изберем ZXing: ако приложението трябва да работи на устройства Huawei (без Google Play Services), на Android Go (ограничена памет), или ако е нужна напълно офлайн работа без Play Services. Във всички останали случаи ML Kit е по-бърз, по-точен, по-лесен за интеграция и дава по-добър UX благодарение на мулти-кода и откриването в периферията.
// ZXing Core: прост скенер
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) {
// Кодът не е намерен
}
Scandit като алтернатива — търговски SDK с точност 99.5% и скорост 10–20 мс. Използва собствени невронни мрежи и не изисква Google Play Services. Цена — от $400/месец (2019). Scandit доминира в ритейла и логистиката (Walmart, FedEx). За повечето мобилни приложения ML Kit е достатъчен — Scandit е оправдан само за enterprise задачи с high-volume сканиране.
Apple AVFoundation предоставя нативен Barcode Scanning чрез AVCaptureMetadataOutput. От iOS 7 AVFoundation поддържа сканиране на QR кодове, а от iOS 8 — всички формати EAN, UPC, Code 128, PDF417. AVFoundation не изисква инсталиране на допълнителни SDK — част е от Foundation. Сканирането работи чрез Apple Neural Engine на A12+ — скорост 10–20 мс с минимална консумация на енергия.
Предимства на AVFoundation: нулева зависимост, автоматична обработка на ориентацията на камерата, вградена поддръжка на light/dark mode, работа във фонов режим (с background modes). AVFoundation автоматично настройва автофокуса и експозицията за сканиране — разработчикът трябва само да се абонира за делегата captureOutput. Недостатък: по-малко настройки от ML Kit — не може да се включи multi-barcode или филтър за формати.
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 на iOS: ML Kit дава повече контрол — може да настроите формати, да включите multi-barcode, да филтрирате кодове по confidence. AVFoundation — по-бърз на стари устройства (по-малко overhead), но не поддържа Data Matrix, Aztec, PDF417 на iOS < 15. За iOS 15+ е за предпочитане ML Kit. За iOS 12–14 използвайте AVFoundation + fallback към ML Kit за неподдържани формати.
Scandit — търговски SDK за Barcode Scanning с фокус върху ритейл, логистика и здравеопазване. Scandit използва собствени невронни мрежи, обучени върху 10+ милиона изображения на баркодове в различни условия: отблясъци, повреди, слабо осветление, наклон до 45°, отражения. Scandit сканира кодове на разстояние до 15 метра (за PDF417 в складове) и върху кръгли повърхности (консерви, бутилки).
Възможности на Scandit: SparkScan (single-scan за бързо последователно сканиране), MatrixScan (multi-barcode + AR подсветка на сканираните), PickList (търсене на артикул по баркод с потвърждение). Scandit поддържа 50+ формата, включително GS1 DataBar и Composite Codes. Скорост — 10–15 мс за код. Точност — 99.5% при стандартно осветление, 97% при лошо.
// Scandit MatrixScan (изисква се 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 е платен ($400+/месец), но дава enterprise функции: SparkScan (хардуерен бутон на корпоративни устройства), MatrixScan (AR overlay за подсветка), PickList (гласово потвърждение). ML Kit е безплатен и е достатъчен за 90% от мобилните приложения: магазинни скенери, QR четеци, билетни приложения. Scandit е оправдан само за логистични терминали с устройства Zebra/Honeywell.
Оптимизация на Barcode Scanning включва настройка на камерата, резолюцията и SDK. Основно правило: по-малко пиксели — по-бързо сканиране. За ML Kit оптималната резолюция е 480p (640x480) за видео и 720p (1280x720) за снимки. Увеличаването до 1080p забавя обработката 2–3 пъти без повишаване на точността. Използвайте CameraX с ImageAnalysis за автоматично управление на резолюцията.
Фокус и експозиция са критични за качеството на сканирането. ML Kit не настройва камерата автоматично — разработчикът трябва да включи continuous auto-focus и continuous auto-exposure чрез Camera2 или CameraX. Без автофокус размазаните кодове намаляват точността до 60–70%. За сканиране от близко разстояние (5–15 см) използвайте macro режима на камерата, ако е наличен.
Auto-zoom и finder overlay — потребителски UX подобрения. Auto-zoom приближава кода при откриването му (като в камерата на Google Lens). Реализира се чрез анализ на boundingBox на кода и мащабиране на preview. Finder overlay — графична рамка, показваща накъде да се насочи камерата. За по-добър UX показвайте boundingBox на намерения код и го оцветявайте в зелено при успешно декодиране.
// CameraX + ML Kit: оптимизиран скенер
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 {
// Хаптика + звук + подсветка на кода
}
}
.addOnCompleteListener { image.close() }
}
}
Обратна връзка към потребителя: вибрация (HapticFeedback), звук (MediaActionSound), визуална подсветка (Canvas/Overlay). След успешно сканиране добавете забавяне 1000–1500 мс (throttling) преди следващото сканиране — това предотвратява дублиране на задействанията върху един код. За последователно сканиране (сканиране на пакет стоки) използвайте SparkScan подхода: всяко сканиране се записва и озвучава, забавяне 300–500 мс.
Често задавани въпроси
ML Kit Barcode Scanning — най-добрият избор за Android: безплатно, 98.5% точност, мулти-код, откриване във всяка част на кадъра. Ако приложението трябва да работи на устройства Huawei без Google Play — използвайте ZXing (open-source, по-ниска точност). За enterprise логистика — Scandit (платен, 99.5% точност, SparkScan). За прост QR скенер е достатъчен ZXing или ML Kit.
ML Kit Barcode Scanning поддържа 14 формата: 1D — EAN-8, EAN-13, UPC-A, UPC-E, Code 39, Code 93, Code 128, ITF, Codabar; 2D — QR Code, Data Matrix, PDF417, Aztec. Поддържа се и GS1 DataBar (RSS-14, RSS-Expanded). Пълният списък — в документацията Barcode.FORMAT_*. За ограничаване на форматите използвайте setBarcodeFormats() — това ускорява сканирането 2–3 пъти.
Намалете резолюцията на камерата до 480p (640x480), включете continuous auto-focus, ограничете форматите до нужните (setBarcodeFormats), използвайте FAST performance mode. За ML Kit посочете само необходимите формати — изключването на излишните формати ускорява сканирането 2–3 пъти. За ZXing използвайте HybridBinarizer вместо GlobalHistogramBinarizer (с 20% по-бърз). За AVFoundation — посочете metadataObjectTypes.
Да, всички локални Barcode Scanning SDK (ML Kit, ZXing, AVFoundation, Scandit) работят напълно офлайн. ML Kit изисква интернет само при първото сваляне на модела (downloaded mode), след което моделът се кешира на устройството. AVFoundation — вграден в iOS, не изисква интернет. ZXing — напълно офлайн без Play Services. Облачното сканиране (Google Cloud Vision) не се използва в мобилните приложения.
ML Kit и Scandit имат вградена корекция на повредени кодове благодарение на невронните алгоритми. ML Kit възстановява до 30% от повредения код (драскотини, прекъсвания). Scandit — до 50% благодарение на обучението върху дефектни кодове. ZXing практически не възстановява повредени кодове — изисква ясно изображение. За сканиране на дефектни кодове използвайте Scandit или ML Kit с ACCURATE performance mode.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също