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

Оператор на складе сканирует товары в быстром темпе. Если камера захватывает лишние коды или задерживается на 1-2 секунды, скорость учёта падает. Мы решили эту проблему для сети магазинов «Продукты 24» — после настройки пайплайна задержка сократилась с 2 секунд до 300 мс. За 10 лет мы реализовали ск

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

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

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

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

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

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

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

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    895
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    1002
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    597

Оператор на складе сканирует товары в быстром темпе. Если камера захватывает лишние коды или задерживается на 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],
);