Barcode Scanning di Aplikasi — Apa Itu, Tipe Kode dan ML Kit

Penulis: IT Sectr Diterbitkan: 2026-07-18 Waktu membaca: 10 mnt

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 — pembacaan kode satu dan dua dimensi dengan kamera
  • ML Kit Barcode — SDK paling akurat (98.5%), multi-kode, semua format
  • Format — EAN, UPC, QR, Data Matrix, PDF417, Aztec, Code 128
  • Real-time — pemindaian hingga 60 FPS dengan CameraX dan AVFoundation
  • On-device — semua komputasi lokal, tanpa internet

Apa itu Barcode Scanning: prinsip dan format

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.

FormatTipeMaks. dataPenggunaan
EAN-131D13 digitBarang di toko
QR Code2D4296 karakterTautan, pembayaran, tiket
Data Matrix2D2335 karakterIndustri, medis
PDF4172D2710 karakterDokumen, boarding pass
Code 1281D80 karakterLogistik, 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: integrasi dan konfigurasi

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%.

kotlin
// 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 vs ML Kit: perbandingan pustaka

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.

KarakteristikML KitZXing
Akurasi98.5%92%
Kecepatan15–30 ms50–150 ms
Multi-kodeYaTidak
Google PlayDiperlukanTidak diperlukan
Kode di sudutMendeteksiTidak 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.

kotlin
// 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.

\n\n
\n

Apple AVFoundation: pemindai native di iOS

\n

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.

\n

Kelebihan 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\n
swift\n
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 ?? "")
    }
}
\n
\n\n

ML 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.

\n
\n\n
\n

Scandit: solusi komersial untuk enterprise

\n

Scandit — 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).

\n

Kemampuan 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
kotlin\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
    }
}
\n
\n\n

Scandit 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.

\n
\n\n
\n

Optimasi Pemindaian: kecepatan dan akurasi

\n

Optimasi 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.

\n

Fokus 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.

\n

Auto-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
kotlin\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() }
    }
}
\n
\n\n

Umpan 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.

\n
\n\n
\n

Pertanyaan Umum

\n
\nSDK mana yang terbaik untuk pemindaian barcode di Android?\n
\n

ML 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.

\n
\n
\n
\nFormat barcode apa saja yang didukung ML Kit?\n
\n

ML 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.

\n
\n
\n
\nBagaimana cara mempercepat pemindaian barcode?\n
\n

Kurangi 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.

\n
\n
\n
\nApakah pemindaian barcode berfungsi tanpa internet?\n
\n

Ya, 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.

\n
\n
\n
\nBisakah barcode yang rusak atau buram dipindai?\n
\n

ML 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.

\n
\n
\n
\n\n
\n

Kesimpulan

\n
    \n
  • Barcode Scanning — deteksi dan dekode kode 1D/2D dengan kamera ponsel
  • \n
  • ML Kit — akurasi 98.5%, multi-kode, deteksi di bagian bingkai mana pun, gratis
  • \n
  • ZXing — open-source, kompatibel dengan perangkat apa pun, akurasi 92%
  • \n
  • AVFoundation — pemindai iOS native, tertanam di sistem (iOS 7+)
  • \n
  • Scandit — SDK enterprise (99.5%), SparkScan, MatrixScan, dari $400/bulan
  • \n
  • Optimasi — resolusi 480p, fokus otomatis, batasan format, Haptic feedback
  • \n
  • Semua format — EAN, UPC, QR, Data Matrix, PDF417, Aztec, Code 128
  • \n
\n
\n\n

Kami 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.

Diskusikan proyek

Baca juga