Barcode Scanning là công nghệ đọc và giải mã mã vạch bằng camera của thiết bị di động. Không giống như máy quét laser yêu cầu thiết bị chuyên dụng, máy quét camera hoạt động trên mọi điện thoại thông minh có camera. Trong phát triển di động, Barcode Scanning được triển khai qua ML Kit Barcode Scanning (Google), AVFoundation (Apple), ZXing (mã nguồn mở) hoặc Scandit (SDK thương mại). Theo Google ML Kit, 2025, thư viện xử lý hơn 2 tỷ lượt quét mỗi ngày với độ chính xác 98,5%.
Các điểm chính
Barcode Scanning là quá trình nhận dạng quang học mã vạch bằng camera. Thuật toán chụp ảnh, tìm mã (định vị), giải mã (trích xuất dữ liệu) và trả về giá trị chuỗi. SDK hiện đại có thể quét mã ở mọi hướng, kích thước và điều kiện ánh sáng — người dùng chỉ cần hướng camera.
Định dạng mã vạch được chia thành hai nhóm: 1D (tuyến tính) — EAN-13, UPC-A, Code 128, Code 39, ITF, Codabar — chứa tới 20–30 ký tự, dùng cho sản phẩm và hậu cần; 2D (ma trận) — QR Code, Data Matrix, PDF417, Aztec — chứa tới hơn 3000 ký tự, dùng cho liên kết, vé, tài liệu. ML Kit hỗ trợ 14 định dạng — tất cả định dạng 1D và 2D phổ biến.
Data Matrix là mã 2D tương tự QR nhưng nhỏ gọn hơn. Nó được sử dụng trong công nghiệp (đánh dấu linh kiện), vé điện tử (IATA BCBP), mẫu y tế. Data Matrix có thể chứa tới 2335 ký tự và được in trên bề mặt rất nhỏ — tới 2x2 mm. Không giống QR, Data Matrix không có mẫu định vị (hình vuông ở góc) và yêu cầu hiệu chỉnh camera chính xác hơn.
| Định dạng | Loại | Dữ liệu tối đa | Ứng dụng |
|---|---|---|---|
| EAN-13 | 1D | 13 chữ số | Sản phẩm bán lẻ |
| QR Code | 2D | 4296 ký tự | Liên kết, thanh toán, vé |
| Data Matrix | 2D | 2335 ký tự | Công nghiệp, y tế |
| PDF417 | 2D | 2710 ký tự | Tài liệu, thẻ lên máy bay |
| Code 128 | 1D | 80 ký tự | Hậu cần, vận tải |
QR Code là định dạng 2D phổ biến nhất trong ứng dụng di động. Nó chứa URL, văn bản, vCard, cấu hình WiFi, thông tin thanh toán (UPI, SBP). QR Code có 40 phiên bản (từ 21x21 đến 177x177 mô-đun) và 4 mức sửa lỗi (L: 7%, M: 15%, Q: 25%, H: 30%). Cho ứng dụng di động, hãy sử dụng phiên bản 2–10 (25x25 – 57x57 mô-đun) — sự cân bằng tối ưu giữa kích thước và dữ liệu.
ML Kit Barcode Scanning là SDK chính cho ứng dụng Android. ML Kit tự động tìm tất cả mã trong ảnh (không giống ZXing yêu cầu mã phải ở trung tâm). API trả về đối tượng Barcode với rawValue (nội dung văn bản), format (loại mã), boundingBox và cornerPoints (4 điểm góc của mã). ML Kit hỗ trợ quét đơn (single-scan) và quét liên tục (continuous-scan).
Chế độ đa mã — ML Kit có thể phát hiện nhiều mã trong một ảnh. Kích hoạt qua BarcodeScannerOptions.Builder(). Ở chế độ đa mã, danh sách Barcode được trả về. Sử dụng cho kiểm kê (quét lô sản phẩm), nhận dạng nhiều mã QR trên bàn. Đa mã bị tắt theo mặc định — chỉ kích hoạt nếu cần vì nó làm chậm quét 20–30%.
// 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
}
}
Lọc định dạng — tối ưu hóa bắt buộc. setBarcodeFormats() giới hạn các định dạng ML Kit sẽ tìm kiếm. Nếu ứng dụng chỉ quét mã QR — hãy chỉ định FORMAT_QR_CODE. Điều này tăng tốc quét 2–3 lần bằng cách loại trừ thuật toán giải mã của các định dạng khác. Cho máy quét bán lẻ — FORMAT_EAN_13 | FORMAT_UPC_A. Cho hậu cần — FORMAT_CODE_128 | FORMAT_CODE_39 | FORMAT_PDF417.
ZXing (Zebra Crossing) là thư viện mã nguồn mở bằng Java (Android) với các bản chuyển sang Swift, React Native, Flutter. ZXing từng là tiêu chuẩn thực tế cho quét trước khi ML Kit ra đời. Nó hỗ trợ tất cả định dạng phổ biến, hoạt động trên mọi thiết bị (bao gồm Huawei không có Google Play) và không yêu cầu Google Play Services. Nhược điểm: chậm hơn ML Kit 2–3 lần, không tìm thấy mã ở cạnh khung hình, không có đa mã.
ML Kit vs ZXing — ML Kit vượt trội về tốc độ, độ chính xác và UX. ML Kit phát hiện mã ngay cả khi nó chỉ chiếm 10% khung hình và ở góc. ZXing yêu cầu mã phải chiếm 50–80% khung hình và ở trung tâm. ML Kit sử dụng mạng nơ-ron (MobileNetV2-SSD) để định vị mã, ZXing sử dụng phân tích nhị phân cổ điển và tìm kiếm mẫu định vị. Theo Google (2025), ML Kit đạt độ chính xác 98,5% so với 92% của ZXing.
| Đặc điểm | ML Kit | ZXing |
|---|---|---|
| Độ chính xác | 98,5% | 92% |
| Tốc độ | 15–30 ms | 50–150 ms |
| Đa mã | Có | Không |
| Google Play | Yêu cầu | Không yêu cầu |
| Mã ở góc | Phát hiện | Không phát hiện |
Khi nào chọn ZXing: nếu ứng dụng phải chạy trên thiết bị Huawei (không có Google Play Services), trên Android Go (bộ nhớ hạn chế), hoặc cần hoạt động ngoại tuyến hoàn toàn không có Play Services. Cho mọi trường hợp khác — ML Kit nhanh hơn, chính xác hơn, dễ tích hợp hơn và cung cấp UX tốt hơn nhờ đa mã và phát hiện ở cạnh.
// 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 như một giải pháp thay thế — SDK thương mại với độ chính xác 99,5% và tốc độ 10–20 ms. Nó sử dụng mạng nơ-ron riêng và không yêu cầu Google Play Services. Giá — từ $400/tháng (2019). Scandit thống trị trong bán lẻ và hậu cần (Walmart, FedEx). Cho hầu hết ứng dụng di động, ML Kit là đủ — Scandit chỉ hợp lý cho các tác vụ doanh nghiệp với khối lượng quét lớn.
Apple AVFoundation cung cấp Barcode Scanning gốc qua AVCaptureMetadataOutput. Từ iOS 7, AVFoundation hỗ trợ quét mã QR, và từ iOS 8 — tất cả định dạng EAN, UPC, Code 128, PDF417. AVFoundation không yêu cầu SDK bổ sung — nó là một phần của Foundation. Quét hoạt động qua Apple Neural Engine trên A12+ — tốc độ 10–20 ms với mức tiêu thụ điện năng tối thiểu.
Ưu điểm của AVFoundation: không phụ thuộc, xử lý hướng camera tự động, hỗ trợ chế độ sáng/tối tích hợp, hoạt động nền (với background modes). AVFoundation tự động điều chỉnh lấy nét và phơi sáng cho quét — nhà phát triển chỉ cần đăng ký delegate captureOutput. Nhược điểm: ít cài đặt hơn ML Kit — không thể bật đa mã hoặc lọc định dạng.
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 trên iOS: ML Kit cung cấp nhiều kiểm soát hơn — có thể cấu hình định dạng, bật đa mã, lọc mã theo độ tin cậy. AVFoundation nhanh hơn trên thiết bị cũ (ít chi phí hơn), nhưng không hỗ trợ Data Matrix, Aztec, PDF417 trên iOS < 15. Cho iOS 15+ nên dùng ML Kit. Cho iOS 12–14 sử dụng AVFoundation + dự phòng ML Kit cho các định dạng không được hỗ trợ.
Scandit là SDK thương mại cho Barcode Scanning tập trung vào bán lẻ, hậu cần và y tế. Scandit sử dụng mạng nơ-ron riêng được đào tạo trên hơn 10 triệu hình ảnh mã vạch trong nhiều điều kiện khác nhau: lóa, hư hỏng, thiếu sáng, nghiêng tới 45°, phản xạ. Scandit quét mã ở khoảng cách lên tới 15 mét (cho PDF417 trong kho) và trên bề mặt cong (lon, chai).
Tính năng của Scandit: SparkScan (quét đơn để quét tuần tự nhanh), MatrixScan (đa mã + đánh dấu AR các mục đã quét), PickList (tìm kiếm sản phẩm theo mã vạch với xác nhận). Scandit hỗ trợ hơn 50 định dạng, bao gồm GS1 DataBar và Composite Codes. Tốc độ — 10–15 ms mỗi mã. Độ chính xác — 99,5% trong điều kiện ánh sáng tiêu chuẩn, 97% trong điều kiện thiếu sáng.
// 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 trả phí ($400+/tháng), nhưng cung cấp tính năng doanh nghiệp: SparkScan (nút phần cứng trên thiết bị doanh nghiệp), MatrixScan (lớp phủ AR để đánh dấu), PickList (xác nhận bằng giọng nói). ML Kit miễn phí và đủ cho 90% ứng dụng di động: máy quét cửa hàng, đầu đọc QR, ứng dụng vé. Scandit chỉ hợp lý cho các thiết bị đầu cuối hậu cần với thiết bị Zebra/Honeywell.
Tối ưu hóa Barcode Scanning bao gồm cài đặt camera, độ phân giải và SDK. Nguyên tắc chính: ít pixel hơn — quét nhanh hơn. Cho ML Kit, độ phân giải tối ưu là 480p (640x480) cho video và 720p (1280x720) cho ảnh. Tăng lên 1080p làm chậm xử lý 2–3 lần mà không cải thiện độ chính xác. Sử dụng CameraX với ImageAnalysis để quản lý độ phân giải tự động.
Lấy nét và phơi sáng rất quan trọng cho chất lượng quét. ML Kit không cấu hình camera tự động — nhà phát triển phải bật lấy nét tự động liên tục và phơi sáng tự động liên tục qua Camera2 hoặc CameraX. Không có lấy nét tự động, mã mờ làm giảm độ chính xác xuống 60–70%. Cho quét khoảng cách gần (5–15 cm), sử dụng chế độ macro của camera nếu có.
Tự động thu phóng và lớp phủ định vị — cải tiến UX người dùng. Tự động thu phóng phóng to mã khi được phát hiện (như trong camera Google Lens). Được triển khai bằng cách phân tích boundingBox của mã và chia tỷ lệ xem trước. Lớp phủ định vị là khung đồ họa hiển thị nơi hướng camera. Cho UX tốt nhất, hiển thị boundingBox của mã tìm thấy và tô sáng màu xanh lá khi giải mã thành công.
// 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() }
}
}
Phản hồi người dùng: rung (HapticFeedback), âm thanh (MediaActionSound), đánh dấu trực quan (Canvas/Overlay). Sau khi quét thành công, thêm độ trễ 1000–1500 ms (điều tiết) trước lần quét tiếp theo — điều này ngăn kích hoạt trùng lặp trên cùng một mã. Cho quét tuần tự (quét lô), sử dụng phương pháp SparkScan: mỗi lần quét được ghi lại và thông báo, với độ trễ 300–500 ms.
Các câu hỏi thường gặp
ML Kit Barcode Scanning là lựa chọn tốt nhất cho Android: miễn phí, độ chính xác 98,5%, đa mã, phát hiện ở mọi phần của khung hình. Nếu ứng dụng phải chạy trên thiết bị Huawei không có Google Play — sử dụng ZXing (mã nguồn mở, độ chính xác thấp hơn). Cho hậu cần doanh nghiệp — Scandit (trả phí, độ chính xác 99,5%, SparkScan). Cho máy quét QR đơn giản, ZXing hoặc ML Kit là đủ.
ML Kit Barcode Scanning hỗ trợ 14 định dạng: 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) cũng được hỗ trợ. Danh sách đầy đủ trong tài liệu Barcode.FORMAT_*. Để giới hạn định dạng, sử dụng setBarcodeFormats() — điều này tăng tốc quét 2–3 lần.
Giảm độ phân giải camera xuống 480p (640x480), bật lấy nét tự động liên tục, giới hạn định dạng cần thiết (setBarcodeFormats), sử dụng chế độ hiệu suất FAST. Cho ML Kit chỉ định rõ các định dạng cần thiết — loại trừ định dạng thừa giúp tăng tốc quét 2–3 lần. Cho ZXing — sử dụng HybridBinarizer thay vì GlobalHistogramBinarizer (nhanh hơn 20%). Cho AVFoundation — chỉ định metadataObjectTypes.
Có, tất cả SDK quét mã vạch cục bộ (ML Kit, ZXing, AVFoundation, Scandit) đều hoạt động hoàn toàn ngoại tuyến. ML Kit chỉ cần internet cho lần tải mô hình đầu tiên (chế độ đã tải xuống), sau đó mô hình được lưu vào bộ nhớ đệm trên thiết bị. AVFoundation được tích hợp trong iOS, không cần internet. ZXing hoàn toàn ngoại tuyến không cần Play Services. Quét đám mây (Google Cloud Vision) không được sử dụng trong ứng dụng di động.
ML Kit và Scandit có tính năng sửa lỗi tích hợp cho mã bị hỏng nhờ thuật toán mạng nơ-ron. ML Kit phục hồi tới 30% mã bị hỏng (trầy xước, rách). Scandit — tới 50% nhờ đào tạo trên mã bị lỗi. ZXing hầu như không phục hồi mã bị hỏng — yêu cầu hình ảnh rõ nét. Để quét mã bị lỗi, sử dụng Scandit hoặc ML Kit với chế độ hiệu suất ACCURATE.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm