Barcode Scanning — فناوری خواندن و رمزگشایی بارکدها با استفاده از دوربین دستگاه موبایل است. برخلاف اسکنرهای لیزری که به سختافزار تخصصی نیاز دارند، اسکنرهای دوربینی روی هر گوشی هوشمند دارای دوربین کار میکنند. در توسعه موبایل، Barcode Scanning از طریق ML Kit Barcode Scanning (گوگل)، AVFoundation (اپل)، ZXing (منبعباز) یا Scandit (SDK تجاری) پیادهسازی میشود. طبق دادههای Google ML Kit, 2025، این کتابخانه روزانه بیش از ۲ میلیارد اسکن را با دقت 98.5% پردازش میکند.
نکات کلیدی
Barcode Scanning فرآیند تشخیص نوری بارکدها با دوربین است. الگوریتم تصویر را میگیرد، کد را در آن پیدا میکند (مکاننمایی)، آن را رمزگشایی میکند (استخراج داده) و مقدار رشتهای را برمیگرداند. SDKهای مدرن کدها را در هر جهت، هر اندازه و در هر نورپردازی اسکن میکنند — کاربر فقط کافی است دوربین را نشانه بگیرد.
فرمتهای بارکد به دو گروه تقسیم میشوند: 1D (خطی) — EAN-13، UPC-A، Code 128، Code 39، ITF، Codabar — حاوی حداکثر ۲۰ تا ۳۰ کاراکتر هستند و برای کالاها و لجستیک استفاده میشوند؛ 2D (ماتریسی) — QR Code، Data Matrix، PDF417، Aztec — حاوی بیش از 3000+ کاراکتر هستند و برای لینکها، بلیتها و اسناد استفاده میشوند. ML Kit از ۱۴ فرمت پشتیبانی میکند — همه 1D و 2D رایج.
Data Matrix یک کد دوبعدی شبیه به QR اما فشردهتر است. در صنعت (علامتگذاری قطعات)، بلیتهای الکترونیکی (IATA BCBP) و نمونههای پزشکی استفاده میشود. Data Matrix میتواند تا ۲۳۳۵ کاراکتر را در خود نگه دارد و روی سطوح بسیار کوچک — تا 2x2 میلیمتر — اعمال میشود. برخلاف QR، Data Matrix الگوهای جستجو (مربعهای گوشه) ندارد و به کالیبراسیون دقیقتری دوربین نیاز دارد.
| فرمت | نوع | حداکثر داده | کاربرد |
|---|---|---|---|
| EAN-13 | 1D | ۱۳ رقم | کالاهای فروشگاهی |
| QR Code | 2D | ۴۲۹۶ کاراکتر | لینکها، پرداختها، بلیتها |
| Data Matrix | 2D | ۲۳۳۵ کاراکتر | صنعت، پزشکی |
| PDF417 | 2D | ۲۷۱۰ کاراکتر | اسناد، بلیتهای پرواز |
| Code 128 | 1D | ۸۰ کاراکتر | لجستیک، حملونقل |
QR Code محبوبترین فرمت دوبعدی در برنامههای موبایل است. شامل URL، متن، vCard، پیکربندی WiFi و اطلاعات پرداخت (UPI، SBP) است. QR Code دارای ۴۰ نسخه (از 21x21 تا 177x177 ماژول) و ۴ سطح تصحیح خطا (L: 7%، M: 15%، Q: 25%، H: 30%) است. برای برنامههای موبایل از نسخه ۲ تا ۱۰ (ماژولهای 25x25 تا 57x57) استفاده کنید — تعادل بهینه بین اندازه و داده.
ML Kit Barcode Scanning SDK اصلی برای برنامههای اندروید است. ML Kit بهطور خودکار همه کدها را در تصویر پیدا میکند (برخلاف ZXing که نیاز دارد کد در مرکز باشد). API شیء Barcode را با rawValue (محتوای متنی)، format (نوع کد)، boundingBox و cornerPoints (۴ نقطه گوشه کد) برمیگرداند. ML Kit از single-scan (یک فریم) و continuous-scan (جریان ویدیو) پشتیبانی میکند.
حالت چند بارکد — ML Kit میتواند چندین کد را در یک تصویر شناسایی کند. از طریق BarcodeScannerOptions.Builder() فعال کنید. در حالت چندگانه، فهرستی از Barcode برگردانده میشود. برای موجودیگردانی (اسکن دسته کالا) و شناسایی چند QR روی میز استفاده کنید. بهطور پیشفرض حالت چندبارکد غیرفعال است — فقط در صورت نیاز فعال کنید، زیرا اسکن را ۲۰ تا ۳۰ درصد کند میکند.
// حالت چندبارکد ML Kit Barcode Scanning
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 را مشخص کنید. این کار با حذف الگوریتمهای رمزگشایی سایر فرمتها، اسکن را ۲ تا ۳ برابر سریعتر میکند. برای اسکنر فروشگاهی — FORMAT_EAN_13 | FORMAT_UPC_A. برای لجستیک — FORMAT_CODE_128 | FORMAT_CODE_39 | FORMAT_PDF417.
ZXing (Zebra Crossing) یک کتابخانه منبعباز به زبان جاوا (اندروید) با پورتهایی برای Swift، React Native و Flutter است. ZXing استاندارد عملی اسکن قبل از ظهور ML Kit است. از همه فرمتهای محبوب پشتیبانی میکند، روی هر دستگاهی کار میکند (از جمله Huawei بدون Google Play) و به Google Play Services نیازی ندارد. معایب: ۲ تا ۳ برابر کندتر از ML Kit، کدهای لبه قاب را پیدا نمیکند، حالت چندبارکد ندارد.
ML Kit در برابر ZXing — ML Kit از نظر سرعت، دقت و UX برنده است. ML Kit کد را حتی اگر ۱۰ درصد قاب را اشغال کند و در گوشه باشد شناسایی میکند. ZXing نیاز دارد کد ۵۰ تا ۸۰ درصد قاب را اشغال کند و در مرکز باشد. ML Kit از شبکه عصبی (MobileNetV2-SSD) برای مکاننمایی کد استفاده میکند، ZXing — باینریسازی کلاسیک و جستجوی finder patterns. طبق دادههای گوگل (۲۰۲۵)، ML Kit دقت 98.5% در برابر 92% برای ZXing دارد.
| ویژگی | ML Kit | ZXing |
|---|---|---|
| دقت | 98.5% | 92% |
| سرعت | ۱۵ تا ۳۰ میلیثانیه | ۵۰ تا ۱۵۰ میلیثانیه |
| چندکدی | بله | خیر |
| Google Play | نیاز دارد | نیاز ندارد |
| کد در گوشه | شناسایی میکند | شناسایی نمیکند |
چه زمانی ZXing را انتخاب کنیم: اگر برنامه باید روی دستگاههای Huawei (بدون Google Play Services)، Android Go (حافظه محدود) کار کند، یا نیاز به کار کاملاً آفلاین بدون Play Services است. در سایر موارد ML Kit سریعتر، دقیقتر، سادهتر در یکپارچهسازی است و به لطف چندبارکد و شناسایی در لبهها UX بهتری میدهد.
// ZXing Core: اسکنر ساده
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) {
// کد پیدا نشد
}
Scandit بهعنوان جایگزین — SDK تجاری با دقت 99.5% و سرعت ۱۰ تا ۲۰ میلیثانیه. از شبکههای عصبی اختصاصی استفاده میکند و به Google Play Services نیاز ندارد. قیمت — از ۴۰۰ دلار/ماه (۲۰۱۹). Scandit در خردهفروشی و لجستیک (Walmart، FedEx) غالب است. برای اکثر برنامههای موبایل ML Kit کافی است — Scandit فقط برای وظایف سازمانی با اسکن پرحجم توجیه دارد.
Apple AVFoundation Barcode Scanning بومی را از طریق AVCaptureMetadataOutput فراهم میکند. از iOS 7، AVFoundation از اسکن QR و از iOS 8 همه فرمتهای EAN، UPC، Code 128 و PDF417 پشتیبانی میکند. AVFoundation نیازی به نصب SDK اضافی ندارد — بخشی از Foundation است. اسکن از طریق Apple Neural Engine در A12+ کار میکند — سرعت ۱۰ تا ۲۰ میلیثانیه با حداقل مصرف انرژی.
مزایای AVFoundation: وابستگی صفر، پردازش خودکار جهت دوربین، پشتیبانی داخلی از حالت روشن/تاریک، کار در پسزمینه (با background modes). AVFoundation بهطور خودکار فوکوس و نوردهی را برای اسکن تنظیم میکند — توسعهدهنده فقط باید روی delegate آ captureOutput مشترک شود. عیب: تنظیمات کمتری نسبت به ML Kit دارد — نمیتوان چندبارکد یا فیلتر فرمت فعال کرد.
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 در برابر AVFoundation در iOS: ML Kit کنترل بیشتری میدهد — میتوان فرمتها را پیکربندی کرد، چندبارکد را فعال کرد و کدها را بر اساس confidence فیلتر کرد. AVFoundation در دستگاههای قدیمی سریعتر است (overhead کمتر)، اما از Data Matrix، Aztec و PDF417 در iOS < 15 پشتیبانی نمیکند. برای iOS 15+، ML Kit ترجیح داده میشود. برای iOS ۱۲ تا ۱۴ از AVFoundation + fallback به ML Kit برای فرمتهای پشتیبانینشده استفاده کنید.
Scandit یک SDK تجاری برای Barcode Scanning با تمرکز بر خردهفروشی، لجستیک و بهداشت و درمان است. Scandit از شبکههای عصبی اختصاصی آموزشدیده روی بیش از ۱۰ میلیون تصویر بارکد در شرایط مختلف استفاده میکند: انعکاس، آسیب، نور کم، شیب تا ۴۵ درجه و بازتاب. Scandit کدها را تا فاصله ۱۵ متر (برای PDF417 در انبارها) و روی سطوح منحنی (قوطی، بطری) اسکن میکند.
قابلیتهای Scandit: SparkScan (اسکن تکی برای اسکن سریع متوالی)، MatrixScan (چندبارکد + هایلایت AR کدهای اسکنشده)، PickList (جستجوی کالا با بارکد و تأیید). Scandit از بیش از ۵۰ فرمت از جمله GS1 DataBar و Composite Codes پشتیبانی میکند. سرعت — ۱۰ تا ۱۵ میلیثانیه برای هر کد. دقت — 99.5% در نور استاندارد و 97% در نور ضعیف.
// Scandit MatrixScan (نیازمند مجوز SDK)
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 در برابر ML Kit: Scandit پولی است (۴۰۰+ دلار/ماه)، اما قابلیتهای سازمانی میدهد: SparkScan (دکمه سختافزاری در دستگاههای شرکتی)، MatrixScan (overlay AR برای هایلایت)، PickList (تأیید صوتی). ML Kit رایگان است و برای ۹۰ درصد برنامههای موبایل کافی است: اسکنر فروشگاهی، QR-خوان، برنامه بلیت. Scandit فقط برای ترمینالهای لجستیکی با دستگاههای Zebra/Honeywell توجیه دارد.
بهینهسازی Barcode Scanning شامل تنظیم دوربین، وضوح و SDK است. قانون اصلی: پیکسل کمتر — اسکن سریعتر. برای ML Kit وضوح بهینه 480p (640x480) برای ویدیو و 720p (1280x720) برای عکس است. افزایش به 1080p پردازش را ۲ تا ۳ برابر کند میکند بدون افزایش دقت. از CameraX با ImageAnalysis برای مدیریت خودکار وضوح استفاده کنید.
فوکوس و نوردهی برای کیفیت اسکن حیاتی هستند. ML Kit دوربین را خودکار تنظیم نمیکند — توسعهدهنده باید continuous auto-focus و continuous auto-exposure را از طریق Camera2 یا CameraX فعال کند. بدون فوکوس خودکار، کدهای تار دقت را به ۶۰ تا ۷۰ درصد کاهش میدهند. برای اسکن از فاصله نزدیک (۵ تا ۱۵ سانتیمتر) از حالت ماکروی دوربین استفاده کنید، اگر در دسترس است.
زوم خودکار و overlay راهنما — بهبودهای UX کاربردی. زوم خودکار هنگام شناسایی کد آن را نزدیک میکند (مثل دوربین Google Lens). از طریق تحلیل boundingBox کد و بزرگنمایی preview پیادهسازی میشود. Finder overlay — قاب گرافیکی که نشان میدهد دوربین را کجا بگیرید. برای UX بهتر، boundingBox کد یافتشده را نشان دهید و هنگام رمزگشایی موفق آن را سبز کنید.
// CameraX + ML Kit: اسکنر بهینهشده
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 {
// هاپتیک + صدا + هایلایت کد
}
}
.addOnCompleteListener { image.close() }
}
}
بازخورد به کاربر: لرزش (HapticFeedback)، صدا (MediaActionSound)، هایلایت بصری (Canvas/Overlay). پس از اسکن موفق، تأخیر ۱۰۰۰ تا ۱۵۰۰ میلیثانیه (throttling) قبل از اسکن بعدی اضافه کنید — این کار از فعال شدن تکراری روی یک کد جلوگیری میکند. برای اسکن متوالی (اسکن دسته کالا) از رویکرد SparkScan استفاده کنید: هر اسکن ثبت و اعلام صوتی میشود، تأخیر ۳۰۰ تا ۵۰۰ میلیثانیه.
سؤالات متداول
ML Kit Barcode Scanning بهترین انتخاب برای اندروید است: رایگان، دقت 98.5%، چندبارکد، شناسایی در هر بخش از قاب. اگر برنامه باید روی دستگاههای Huawei بدون Google Play کار کند — از ZXing (منبعباز، دقت کمتر) استفاده کنید. برای لجستیک سازمانی — Scandit (پولی، دقت 99.5%، SparkScan). برای یک QR-اسکنر ساده ZXing یا ML Kit کافی است.
ML Kit Barcode Scanning از ۱۴ فرمت پشتیبانی میکند: 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() استفاده کنید — اسکن را ۲ تا ۳ برابر سریعتر میکند.
وضوح دوربین را به 480p (640x480) کاهش دهید، continuous auto-focus را فعال کنید، فرمتها را به موارد لازم محدود کنید (setBarcodeFormats) و از حالت performance FAST استفاده کنید. برای ML Kit فقط فرمتهای لازم را مشخص کنید — حذف فرمتهای اضافی اسکن را ۲ تا ۳ برابر سریع میکند. برای ZXing از HybridBinarizer به جای GlobalHistogramBinarizer استفاده کنید (۲۰ درصد سریعتر). برای AVFoundation — metadataObjectTypes را مشخص کنید.
بله، همه SDKهای محلی Barcode Scanning (ML Kit، ZXing، AVFoundation، Scandit) کاملاً آفلاین کار میکنند. ML Kit فقط هنگام اولین دانلود مدل به اینترنت نیاز دارد (حالت downloaded)، پس از آن مدل روی دستگاه کش میشود. AVFoundation — در iOS تعبیه شده، نیازی به اینترنت ندارد. ZXing — کاملاً آفلاین بدون Play Services. اسکن ابری (Google Cloud Vision) در برنامههای موبایل استفاده نمیشود.
ML Kit و Scandit به لطف الگوریتمهای شبکه عصبی، تصحیح داخلی کدهای آسیبدیده دارند. ML Kit تا ۳۰ درصد کد آسیبدیده (خراش، پارگی) را بازسازی میکند. Scandit — تا ۵۰ درصد به لطف آموزش روی کدهای معیوب. ZXing عملاً کدهای آسیبدیده را بازسازی نمیکند — به تصویر واضح نیاز دارد. برای اسکن کدهای معیوب از Scandit یا ML Kit با حالت performance ACCURATE استفاده کنید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.