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

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 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: 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: нативный сканер на 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 — быстрее на старых устройствах (меньше оверхед), но не поддерживает 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 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 найденного кода и выделяйте его зелёным при успешном декодировании.

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

Часто задаваемые вопросы

Какой 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. Cloud-сканирование (Google Cloud Vision) не используется в мобильных приложениях.

Можно ли сканировать повреждённые или размытые штрих-коды?

ML Kit и Scandit имеют встроенную коррекцию повреждённых кодов благодаря нейросетевым алгоритмам. MLKit восстанавливает до 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 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также