Barcode Scanning — adalah teknologi membaca dan mendekode barcode menggunakan kamera perangkat seluler. Tidak seperti pemindai laser yang memerlukan peralatan khusus, pemindai kamera berfungsi di semua ponsel cerdas yang memiliki kamera. Dalam pengembangan seluler, Barcode Scanning diimplementasikan melalui ML Kit Barcode Scanning (Google), AVFoundation (Apple), ZXing (open-source) atau Scandit (SDK komersial). Menurut Google ML Kit, 2025, pustaka ini memproses 2+ miliar pemindaian per hari dengan akurasi 98.5%.
Poin Penting
Barcode Scanning — proses pengenalan optik barcode menggunakan kamera. Algoritme menangkap gambar, menemukan kode di dalamnya (lokalisasi), mendekodenya (ekstraksi data) dan mengembalikan nilai string. SDK modern memindai kode dalam orientasi, ukuran, dan pencahayaan apa pun — pengguna cukup mengarahkan kamera.
Format barcode terbagi menjadi dua kelompok: 1D (linear) — EAN-13, UPC-A, Code 128, Code 39, ITF, Codabar — berisi hingga 20–30 karakter, digunakan untuk barang, logistik; 2D (matriks) — QR Code, Data Matrix, PDF417, Aztec — berisi hingga 3000+ karakter, digunakan untuk tautan, tiket, dokumen. ML Kit mendukung 14 format — semua format 1D dan 2D populer.
Data Matrix — kode dua dimensi, mirip QR tetapi lebih ringkas. Digunakan di industri (penandaan komponen), tiket elektronik (IATA BCBP), sampel medis. Data Matrix dapat berisi hingga 2335 karakter dan diterapkan pada permukaan yang sangat kecil — hingga 2x2 mm. Tidak seperti QR, Data Matrix tidak memiliki pola pencari (kotak di sudut) dan memerlukan kalibrasi kamera yang lebih presisi.
| Format | Tipe | Maks. data | Penggunaan |
|---|---|---|---|
| EAN-13 | 1D | 13 digit | Barang di toko |
| QR Code | 2D | 4296 karakter | Tautan, pembayaran, tiket |
| Data Matrix | 2D | 2335 karakter | Industri, medis |
| PDF417 | 2D | 2710 karakter | Dokumen, boarding pass |
| Code 128 | 1D | 80 karakter | Logistik, transportasi |
QR Code — format dua dimensi paling populer di aplikasi seluler. Berisi URL, teks, vCard, konfigurasi WiFi, informasi pembayaran (UPI, SBP). QR Code memiliki 40 versi (dari 21x21 hingga 177x177 modul) dan 4 tingkat koreksi kesalahan (L: 7%, M: 15%, Q: 25%, H: 30%). Untuk aplikasi seluler, gunakan versi 2–10 (25x25 – 57x57 modul) — keseimbangan optimal antara ukuran dan data.
ML Kit Barcode Scanning — SDK utama untuk aplikasi Android. ML Kit secara mandiri menemukan semua kode dalam gambar (tidak seperti ZXing yang memerlukan kode berada di tengah). API mengembalikan objek Barcode dengan rawValue (konten teks), format (tipe kode), boundingBox dan cornerPoints (4 titik sudut kode). ML Kit mendukung single-scan (satu bingkai) dan continuous-scan (aliran video).
Mode multi-kode — ML Kit dapat mendeteksi beberapa kode dalam satu gambar. Aktifkan melalui BarcodeScannerOptions.Builder(). Dalam mode multi, daftar Barcode dikembalikan. Gunakan untuk inventarisasi (memindai banyak barang), mengenali beberapa kode QR di atas meja. Secara default multi-kode dinonaktifkan — aktifkan hanya jika perlu, karena ini memperlambat pemindaian 20–30%.
// Mode multi-kode 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, TEKS, TELEPON...
val rawValue = barcode.rawValue
val displayValue = barcode.displayValue
}
}
Penyaringan format — optimalisasi wajib. setBarcodeFormats() membatasi format yang akan dicari ML Kit. Jika aplikasi hanya memindai kode QR — tentukan FORMAT_QR_CODE. Ini mempercepat pemindaian 2–3 kali dengan mengecualikan algoritme dekode format lain. Untuk pemindai toko — FORMAT_EAN_13 | FORMAT_UPC_A. Untuk logistik — FORMAT_CODE_128 | FORMAT_CODE_39 | FORMAT_PDF417.
ZXing (Zebra Crossing) — pustaka open-source di Java (Android) dengan port ke Swift, React Native, Flutter. ZXing adalah standar de facto untuk pemindaian sebelum ML Kit muncul. Mendukung semua format populer, bekerja di perangkat apa pun (termasuk Huawei tanpa Google Play), tidak memerlukan Google Play Services. Kekurangan: 2–3 kali lebih lambat dari ML Kit, tidak menemukan kode di tepi bingkai, tanpa multi-kode.
ML Kit vs ZXing — ML Kit unggul dalam kecepatan, akurasi, dan UX. ML Kit mendeteksi kode bahkan jika hanya menempati 10% bingkai dan berada di sudut. ZXing memerlukan kode menempati 50–80% bingkai dan berada di tengah. ML Kit menggunakan jaringan saraf (MobileNetV2-SSD) untuk lokalisasi kode, ZXing — binerisasi klasik dan pencarian pola. Menurut Google (2025), ML Kit memberikan akurasi 98.5% dibandingkan 92% pada ZXing.
| Karakteristik | ML Kit | ZXing |
|---|---|---|
| Akurasi | 98.5% | 92% |
| Kecepatan | 15–30 ms | 50–150 ms |
| Multi-kode | Ya | Tidak |
| Google Play | Diperlukan | Tidak diperlukan |
| Kode di sudut | Mendeteksi | Tidak mendeteksi |
Kapan memilih ZXing: jika aplikasi harus berjalan di perangkat Huawei (tanpa Google Play Services), di Android Go (memori terbatas), atau jika diperlukan kerja offline penuh tanpa Play Services. Untuk semua kasus lainnya — ML Kit lebih cepat, lebih akurat, lebih mudah diintegrasi dan memberikan UX lebih baik berkat multi-kode dan deteksi tepi.
// ZXing Core: pemindai sederhana
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) {
// Kode tidak ditemukan
}
Scandit sebagai alternatif — SDK komersial dengan akurasi 99.5% dan kecepatan 10–20 ms. Menggunakan jaringan saraf milik sendiri dan tidak memerlukan Google Play Services. Harga — mulai dari $400/bulan (2019). Scandit mendominasi di ritel dan logistik (Walmart, FedEx). Untuk sebagian besar aplikasi seluler, ML Kit sudah cukup — Scandit hanya dibenarkan untuk tugas enterprise dengan pemindaian volume tinggi.
Apple AVFoundation menyediakan Barcode Scanning native melalui AVCaptureMetadataOutput. Mulai iOS 7, AVFoundation mendukung pemindaian kode QR, dan sejak iOS 8 — semua format EAN, UPC, Code 128, PDF417. AVFoundation tidak memerlukan instalasi SDK tambahan — ini bagian dari Foundation. Pemindaian bekerja melalui Apple Neural Engine pada A12+ — kecepatan 10–20 ms dengan konsumsi daya minimal.
\nKelebihan AVFoundation: ketergantungan nol, penanganan orientasi kamera otomatis, dukungan mode terang/gelap bawaan, bekerja di latar belakang (dengan background modes). AVFoundation secara otomatis mengatur fokus dan eksposur untuk pemindaian — pengembang hanya perlu berlangganan delegasi captureOutput. Kekurangan: lebih sedikit pengaturan daripada ML Kit — tidak dapat mengaktifkan multi-kode atau filter format.
\n\nimport 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 ?? "")
}
}\nML Kit vs AVFoundation di iOS: ML Kit memberikan lebih banyak kontrol — dapat mengonfigurasi format, mengaktifkan multi-kode, memfilter kode berdasarkan confidence. AVFoundation lebih cepat di perangkat lama (lebih sedikit overhead) tetapi tidak mendukung Data Matrix, Aztec, PDF417 di iOS < 15. Untuk iOS 15+ ML Kit lebih disukai. Untuk iOS 12–14 gunakan AVFoundation + fallback ke ML Kit untuk format yang tidak didukung.
\nScandit — SDK komersial untuk Barcode Scanning yang berfokus pada ritel, logistik, dan kesehatan. Scandit menggunakan jaringan saraf milik sendiri, dilatih pada 10+ juta gambar barcode dalam berbagai kondisi: silau, kerusakan, pencahayaan rendah, kemiringan hingga 45°, pantulan. Scandit memindai kode dari jarak hingga 15 meter (untuk PDF417 di gudang) dan pada permukaan bulat (kaleng, botol).
\nKemampuan Scandit: SparkScan (single-scan untuk pemindaian sekuensial cepat), MatrixScan (multi-kode + sorotan AR yang sudah dipindai), PickList (pencarian produk berdasarkan barcode dengan konfirmasi). Scandit mendukung 50+ format, termasuk GS1 DataBar dan Composite Codes. Kecepatan — 10–15 ms per kode. Akurasi — 99.5% dalam pencahayaan standar, 97% dalam kondisi minim cahaya.
\n\n// Scandit MatrixScan (lisensi SDK diperlukan)
val barcodeTracking = BarcodeTracking
.forDataCaptureContext(context)
.addListener(this)
.build()
barcodeTracking.addSessionListener { session, _ ->
session.trackedBarcodes.forEach { (trackingId, barcode) ->
val data = barcode.data
val symbolCount = barcode.symbolCount
}
}\nScandit vs ML Kit: Scandit berbayar ($400+/bulan) tetapi memberikan fitur enterprise: SparkScan (tombol perangkat keras di perangkat korporat), MatrixScan (overlay AR untuk sorotan), PickList (konfirmasi suara). ML Kit gratis dan cukup untuk 90% aplikasi seluler: pemindai toko, pembaca QR, aplikasi tiket. Scandit hanya dibenarkan untuk terminal logistik dengan perangkat Zebra/Honeywell.
\nOptimasi Barcode Scanning mencakup konfigurasi kamera, resolusi, dan SDK. Aturan utama: lebih sedikit piksel — pemindaian lebih cepat. Untuk ML Kit, resolusi optimal adalah 480p (640x480) untuk video dan 720p (1280x720) untuk foto. Peningkatan ke 1080p memperlambat pemrosesan 2–3 kali tanpa peningkatan akurasi. Gunakan CameraX dengan ImageAnalysis untuk manajemen resolusi otomatis.
\nFokus dan eksposur sangat penting untuk kualitas pemindaian. ML Kit tidak mengatur kamera secara otomatis — pengembang harus mengaktifkan continuous auto-focus dan continuous auto-exposure melalui Camera2 atau CameraX. Tanpa fokus otomatis, kode buram menurunkan akurasi hingga 60–70%. Untuk pemindaian jarak dekat (5–15 cm) gunakan mode makro kamera jika tersedia.
\nAuto-zoom dan overlay panduan — peningkatan UX pengguna. Auto-zoom memperbesar kode saat terdeteksi (seperti di kamera Google Lens). Diimplementasikan melalui analisis boundingBox kode dan penskalaan pratinjau. Overlay panduan — bingkai grafik yang menunjukkan ke mana harus mengarahkan kamera. Untuk UX lebih baik, tampilkan boundingBox kode yang ditemukan dan sorot dengan warna hijau setelah berhasil didekode.
\n\n// CameraX + ML Kit: pemindai optimal
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 {
// Haptik + suara + sorotan kode
}
}
.addOnCompleteListener { image.close() }
}
}\nUmpan balik pengguna: getaran (HapticFeedback), suara (MediaActionSound), sorotan visual (Canvas/Overlay). Setelah pemindaian berhasil, tambahkan penundaan 1000–1500 ms (throttling) sebelum pemindaian berikutnya — ini mencegah pemicuan ganda pada kode yang sama. Untuk pemindaian sekuensial (memindai banyak barang) gunakan pendekatan SparkScan: setiap pemindaian dicatat dan disuarakan, penundaan 300–500 ms.
\nPertanyaan Umum
\nML Kit Barcode Scanning — pilihan terbaik untuk Android: gratis, akurasi 98.5%, multi-kode, deteksi di bagian bingkai mana pun. Jika aplikasi harus berjalan di perangkat Huawei tanpa Google Play — gunakan ZXing (open-source, akurasi lebih rendah). Untuk logistik enterprise — Scandit (berbayar, akurasi 99.5%, SparkScan). Untuk pembaca QR sederhana, ZXing atau ML Kit sudah cukup.
\nML Kit Barcode Scanning mendukung 14 format: 1D — EAN-8, EAN-13, UPC-A, UPC-E, Code 39, Code 93, Code 128, ITF, Codabar; 2D — QR Code, Data Matrix, PDF417, Aztec. Juga mendukung GS1 DataBar (RSS-14, RSS-Expanded). Daftar lengkap — di dokumentasi Barcode.FORMAT_*. Untuk membatasi format gunakan setBarcodeFormats() — ini mempercepat pemindaian 2–3 kali.
\nKurangi resolusi kamera ke 480p (640x480), aktifkan continuous auto-focus, batasi format ke yang diperlukan (setBarcodeFormats), gunakan mode FAST performance. Untuk ML Kit tentukan hanya format yang diperlukan — mengecualikan format yang tidak perlu mempercepat pemindaian 2–3 kali. Untuk ZXing — gunakan HybridBinarizer daripada GlobalHistogramBinarizer (20% lebih cepat). Untuk AVFoundation — tentukan metadataObjectTypes.
\nYa, semua SDK pemindaian barcode lokal (ML Kit, ZXing, AVFoundation, Scandit) berfungsi sepenuhnya offline. ML Kit memerlukan internet hanya saat pertama kali mengunduh model (mode downloaded), setelah itu model disimpan di cache perangkat. AVFoundation — tertanam di iOS, tidak memerlukan internet. ZXing — sepenuhnya offline tanpa Play Services. Pemindaian cloud (Google Cloud Vision) tidak digunakan di aplikasi seluler.
\nML Kit dan Scandit memiliki koreksi bawaan untuk kode rusak berkat algoritme jaringan saraf. ML Kit memulihkan hingga 30% kode yang rusak (goresan, robekan). Scandit — hingga 50% berkat pelatihan pada kode cacat. ZXing praktis tidak memulihkan kode yang rusak — memerlukan gambar yang jelas. Untuk memindai kode cacat, gunakan Scandit atau ML Kit dengan mode ACCURATE performance.
\nKesimpulan
\nKami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga