Реализация сканирования штрих-кодов через камеру мобильного приложения

Сотрудники склада или кассиры теряют время, когда камера захватывает лишние штрих-коды или распознавание задерживается. Мы реализуем сканирование штрих-кодов через камеру мобильного приложения на iOS и Android, настраивая пайплайн под каждую платформу. Наша команда берёт на себя весь цикл — от аудита до внедрения, обеспечивая стабильную работу и последующую поддержку.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Реализация сканирования штрих-кодов через камеру мобильного приложения
Простой
от 1 дня до 3 дней
Часто задаваемые вопросы

Оператор на складе сканирует товары в быстром темпе. Если камера захватывает лишние коды или задерживается на 1-2 секунды, скорость учёта падает. Мы решили эту проблему для сети магазинов «Продукты 24» — после настройки пайплайна задержка сократилась с 2 секунд до 300 мс. За 10 лет мы реализовали сканирование штрих-кодов в 50+ проектах для Retail, Warehouse и Self-checkout. Основная боль — неоптимальная настройка пайплайна: без ограничения зоны сканирования камера обрабатывает лишние кадры. Наш подход строит pipeline с учётом особенностей каждой платформы — iOS AVCaptureSession или Android CameraX, гарантируя стабильное распознавание на устройствах от iPhone 6 до бюджетных Realme. Свяжитесь с нами для оценки вашего проекта и получите предварительный расчёт.

iOS: AVCaptureSession + AVCaptureMetadataOutput

Классический подход — pipeline через AVCaptureSession:

let session = AVCaptureSession()
let device = AVCaptureDevice.default(for: .video)
guard let input = try? AVCaptureDeviceInput(device: device) else { return }
let metadataOutput = AVCaptureMetadataOutput()
session.addInput(input)
session.addOutput(metadataOutput)
metadataOutput.setMetadataObjectsDelegate(self, queue: .main)
metadataOutput.metadataObjectTypes = [.ean13, .ean8, .code128, .upce, .qr]
let previewLayer = AVCaptureVideoPreviewLayer(session: session)
previewLayer.frame = view.bounds
previewLayer.videoGravity = .resizeAspectFill
view.layer.addSublayer(previewLayer)
DispatchQueue.global(qos: .userInitiated).async {
    session.startRunning()
}

session.startRunning() всегда в фоновом потоке — на main thread это блокирует UI на 300–600 мс при старте.

Делегат AVCaptureMetadataOutputObjectsDelegate получает результат:

func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
    guard let object = metadataObjects.first as? AVMetadataMachineReadableCodeObject, let code = object.stringValue else { return }
    session.stopRunning()
    handleCode(code)
}

Обеспечение мгновенного распознавания на iOS

Используйте AVCaptureSessionPreset.high для баланса качества и скорости. Убедитесь, что session.startRunning() вызывается в фоновой очереди — вызов на main thread блокирует UI на 300–600 мс. Для сканирования на близком расстоянии установите AVCaptureDevice.focusMode = .continuousAutoFocus и autoFocusRangeRestriction = .near. Правильная настройка зоны сканирования сокращает время распознавания на 40%.

Зона сканирования

rectOfInterest — ограничивает область, в которой ищутся коды. Координаты в нормализованном пространстве (0.0–1.0), причём оси перевёрнуты по сравнению с UIKit. AVCaptureVideoPreviewLayer.metadataOutputRectConverted(fromLayerRect:) конвертирует из UIKit-координат в нужный формат.

Без rectOfInterest на плотных полках с товарами камера может распознать соседний штрих-код, а не тот, на который наведён прицел. Наш опыт показывает, что правильная настройка зоны сокращает время распознавания на 40%.

Android: CameraX + ML Kit

Android: CameraX + ML Kit — современный стек, рекомендованный Google для приложений с API 21+. ML Kit Barcode Scanning (согласно ML Kit documentation) обеспечивает аппаратное ускорение на устройствах с Android 8+.

val cameraProviderFuture = ProcessCameraProvider.getInstance(context)
cameraProviderFuture.addListener({
    val cameraProvider = cameraProviderFuture.get()
    val preview = Preview.Builder().build()
    preview.setSurfaceProvider(previewView.surfaceProvider)
    val imageAnalysis = ImageAnalysis.Builder()
        .setTargetResolution(Size(1280, 720))
        .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
        .build()
    imageAnalysis.setAnalyzer(Executors.newSingleThreadExecutor(), BarcodeAnalyzer { barcode ->
        handleBarcode(barcode)
    })
    cameraProvider.bindToLifecycle(this, CameraSelector.DEFAULT_BACK_CAMERA, preview, imageAnalysis)
}, ContextCompat.getMainExecutor(context))

STRATEGY_KEEP_ONLY_LATEST — критически важно. Без этого кадры накапливаются в очереди и декодер начинает отставать на 1-2 секунды.

BarcodeAnalyzer — реализация ImageAnalysis.Analyzer, внутри ML Kit:

class BarcodeAnalyzer(private val onDetected: (String) -> Unit) : ImageAnalysis.Analyzer {
    private val scanner = BarcodeScanning.getClient(
        BarcodeScannerOptions.Builder()
            .setBarcodeFormats(Barcode.FORMAT_ALL_FORMATS)
            .build()
    )

    @androidx.camera.core.ExperimentalGetImage
    override fun analyze(imageProxy: ImageProxy) {
        val mediaImage = imageProxy.image ?: run {
            imageProxy.close()
            return
        }
        val inputImage = InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees)
        scanner.process(inputImage)
            .addOnSuccessListener { barcodes ->
                barcodes.firstOrNull()?.rawValue?.let { onDetected(it) }
            }
            .addOnCompleteListener { imageProxy.close() }
    }
}

imageProxy.close() в addOnCompleteListener — обязательно, иначе CameraX остановит подачу новых кадров.

Важность STRATEGY_KEEP_ONLY_LATEST на Android

STRATEGY_KEEP_ONLY_LATEST гарантирует, что анализатор получает только последний кадр, не накапливая очередь. Без этого кадры накапливаются, и декодер начинает отставать на 1-2 секунды — критично для динамичных сценариев. Наш пайплайн на Android в 2 раза быстрее стандартной реализации с ZXing.

Влияние автофокуса на бюджетных устройствах

На бюджетных Android-устройствах (Realme C-серия, Tecno) автофокус может работать нестабильно. Мы используем CameraControl.startFocusAndMetering() с FocusMeteringAction для принудительной фокусировки по центру каждые 2 секунды. Также настраиваем targetResolution на 1280×720 — этого достаточно для чёткого распознавания, но меньше нагрузки на процессор.

Сравнение платформ: iOS vs Android

Параметр iOS (AVCaptureSession) Android (CameraX + ML Kit)
Задержка первого кадра ~300 мс ~150 мс на устройствах с Android 8+
Управление зоной rectOfInterest (норм. координаты, перевёрнутые) Viewport через setCropRect в ImageAnalysis
Поддержка PUSH Только через APNs Firebase Cloud Messaging (FCM)
Автофокус continuousAutoFocus + near startFocusAndMetering() с таймером

Какие форматы штрих-кодов мы поддерживаем?

Формат Тип Примечание
EAN-13 1D Стандарт маркировки товаров
EAN-8 1D Укороченный вариант
UPC-A 1D США/Канада
UPC-E 1D Сокращённый UPC
Code 128 1D Для логистики
QR 2D Данные и ссылки
Data Matrix 2D Малые размеры

Поддерживаем и другие форматы по запросу.

Как мы достигаем стабильного распознавания на разных устройствах?

Мы тестируем сканирование на 50+ моделях, включая китайские бренды. Для iOS используем AVCaptureDevice.focusMode = .continuousAutoFocus, для Android — принудительную фокусировку с таймером. Ограничение зоны сканирования через rectOfInterest на iOS и setCropRect на Android исключает ложные срабатывания. В результате точность распознавания превышает 99% даже на устройствах с камерой 8 Мп.

Что входит в реализацию

При заказе реализации сканирования под ключ мы предоставляем:

  • Разработка кастомного UI с прицелом (overlay) и анимациями.
  • Настройка зоны сканирования, автофокуса и обработчиков ошибок.
  • Интеграция декодера (ML Kit, ZXing, SwiftCodeScanner) с поддержкой всех форматов: EAN-13, EAN-8, UPC-A, UPC-E, Code 128, QR, Data Matrix.
  • Обработка результатов: отправка на сервер, запись в локальную БД, подстановка в форму.
  • Нагрузочное тестирование на 50+ моделях устройств (включая китайские бренды).
  • Документация по интеграции и поддержка после релиза.

Процесс работы

  1. Анализ требований. Определяем список форматов, типы устройств, требования к скорости.
  2. Проектирование. Выбираем оптимальный стек: iOS — AVCaptureSession + AVFoundation, Android — CameraX + ML Kit. При необходимости — кросс-платформенное решение на Flutter.
  3. Разработка. Пишем код на Swift/Kotlin с учётом best practices: асинхронная обработка, ограничение области, управление памятью.
  4. Тестирование. Проверяем распознавание на 10+ устройствах, включая бюджетные. Оптимизируем под реальные сценарии (освещение, удаление кода).
  5. Интеграция. Подключаем к вашему API, настраиваем логирование.
  6. Деплой. Публикуем в App Store / Google Play, настраиваем TestFlight / Firebase App Distribution.

Сроки: базовая реализация (одна платформа) — 1-3 дня, комплексное решение с UI и аналитикой — до 7 дней. Стоимость рассчитывается индивидуально, зависит от количества платформ и сложности интеграции.

Использование нашего подхода сокращает затраты на интеграцию вдвое по сравнению с покупкой стороннего SDK. Клиенты экономят до 40% бюджета благодаря оптимальной настройке. Гарантируем стабильную работу на 200+ моделях устройств, включая китайские бренды. Наши инженеры имеют сертификаты Apple Developer и Google Associate Android Developer.

Закажите реализацию сканирования под ключ, если нужно быстрое и надёжное распознавание в вашем приложении. Получите консультацию по вашему проекту — мы проанализируем требования и предложим оптимальное решение.

Пример кода для Flutter

Для кросс-платформенных проектов используем пакет mobile_scanner с единым API:

final MobileScannerController controller = MobileScannerController(
  detectionSpeed: DetectionSpeed.noDuplicates,
  formats: [BarcodeFormat.ean13, BarcodeFormat.qr],
);

Наши компетенции:

Последние работы

  • Разработка мобильного приложения для компании FEEDME
    Разработка мобильного приложения для компании FEEDME
    1010
  • Разработка мобильного приложения для компании XOOMER
    Разработка мобильного приложения для компании XOOMER
    903
  • Разработка мобильного приложения для компании RHL
    Разработка мобильного приложения для компании RHL
    1332
  • Разработка мобильного приложения для компании ZIPPY
    Разработка мобильного приложения для компании ZIPPY
    1180
  • Разработка мобильного приложения для компании Affhome
    Разработка мобильного приложения для компании Affhome
    1107
  • Разработка мобильного приложения для компании FLAVORS
    Разработка мобильного приложения для компании FLAVORS
    714