Barcode Scanning — це технологія зчитування та декодування штрих-кодів за допомогою камери мобільного пристрою. На відміну від лазерних сканерів, які потребують спеціалізованого обладнання, камерні сканери працюють на будь-якому смартфоні з камерою. У мобільній розробці 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 multi-code mode
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. Недоліки: повільніший за ML Kit у 2–3 рази, не знаходить коди на периферії кадру, немає 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: simple 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 not found
}
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 — швидший на старих пристроях (менше оверхед), але не підтримує 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 license required)
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: optimized 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 {
// Haptic + sound + code highlight
}
}
.addOnCompleteListener { image.close() }
}
}
Feedback користувачеві: вібрація (HapticFeedback), звук (MediaActionSound), візуальна підсвітка (Canvas/Overlay). Після успішного сканування додайте затримку 1000–1500 мс (throttling) перед наступним сканом — це запобігає дублюванню спрацьовувань на одному коді. Для sequential scanning (сканування пачки товарів) використовуйте 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також