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

Сканування штрих-кодів у мобільному додатку – ключова функція для Retail, Warehouse та Self-checkout. Оператор на складі сканує товари в швидкому темпі. Якщо камера захоплює зайві коди або затримується на 1-2 секунди, швидкість обліку падає. Ми вирішили цю проблему для мережі магазинів «Продукти 24»

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, 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

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

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 дні, вартість від 500$. Комплексне рішення з 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],
);