Barcode Scanning в приложенията — какво е това, видове кодове и ML Kit

Автор: IT Sectr Публикувано: 2026-07-18 Време за четене: 10 мин

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 — разчитане на едно- и двумерни кодове с камера
  • ML Kit Barcode — най-точният SDK (98.5%), мулти-код, всички формати
  • Формати — EAN, UPC, QR, Data Matrix, PDF417, Aztec, Code 128
  • Real-time — сканиране до 60 FPS с CameraX и AVFoundation
  • On-device — всички изчисления локално, без интернет

Какво е Barcode Scanning: принципи и формати

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-131D13 цифриСтоки в магазините
QR Code2D4296 знакаВръзки, плащания, билети
Data Matrix2D2335 знакаПромишленост, медицина
PDF4172D2710 знакаДокументи, бордови карти
Code 1281D80 знакаЛогистика, транспорт

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: интеграция и настройка

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%.

kotlin
// 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 vs ML Kit: сравнение на библиотеките

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 KitZXing
Точност98.5%92%
Скорост15–30 мс50–150 мс
Мулти-кодДаНе
Google PlayИзисква сеНе се изисква
Код в ъгълаОткриваНе открива

Кога да изберем ZXing: ако приложението трябва да работи на устройства Huawei (без Google Play Services), на Android Go (ограничена памет), или ако е нужна напълно офлайн работа без Play Services. Във всички останали случаи ML Kit е по-бърз, по-точен, по-лесен за интеграция и дава по-добър UX благодарение на мулти-кода и откриването в периферията.

kotlin
// 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: нативен скенер на iOS

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 или филтър за формати.

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 на 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: търговско решение за enterprise

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% при лошо.

kotlin
// 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 на намерения код и го оцветявайте в зелено при успешно декодиране.

kotlin
// 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 мс.

Често задавани въпроси

Кое SDK за сканиране на баркодове е най-добро на Android?

ML Kit Barcode Scanning — най-добрият избор за Android: безплатно, 98.5% точност, мулти-код, откриване във всяка част на кадъра. Ако приложението трябва да работи на устройства Huawei без Google Play — използвайте ZXing (open-source, по-ниска точност). За enterprise логистика — Scandit (платен, 99.5% точност, SparkScan). За прост QR скенер е достатъчен ZXing или ML Kit.

Какви формати на баркодове поддържа 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.

Резюме

  • Barcode Scanning — откриване и декодиране на 1D/2D кодове с камерата на смартфона
  • ML Kit — 98.5% точност, мулти-код, откриване във всяка част на кадъра, безплатно
  • ZXing — open-source, съвместимост с всякакви устройства, 92% точност
  • AVFoundation — нативен iOS скенер, вграден в системата (iOS 7+)
  • Scandit — enterprise SDK (99.5%), SparkScan, MatrixScan, от $400/месец
  • Оптимизация — 480p резолюция, автофокус, ограничаване на форматите, Haptic feedback
  • Всички формати — EAN, UPC, QR, Data Matrix, PDF417, Aztec, Code 128

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също