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 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. Cloud-сканирование (Google Cloud Vision) не используется в мобильных приложениях.
ML Kit и Scandit имеют встроенную коррекцию повреждённых кодов благодаря нейросетевым алгоритмам. MLKit восстанавливает до 30% повреждённого кода (царапины, разрывы). Scandit — до 50% благодаря обучению на дефектных кодах. ZXing практически не восстанавливает повреждённые коды — требует чёткого изображения. Для сканирования дефектных кодов используйте Scandit или ML Kit с ACCURATE performance mode.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также