Aturan implementasi
Perlakukan ScanManager sebagai sumber daya perangkat keras dengan pemilik eksplisit. Buka, pilih mode keluaran yang diinginkan, daftarkan penerima dekode, validasi setiap muatan, lalu batalkan pendaftaran dan tutup secara deterministik. Konfirmasikan perilaku metode pada sampel maksud produksi.
Siapkan baseline SDK yang dapat direproduksi
Kemas artefak SDK yang disetujui melalui proses pengunduhan pengembang yang terkontrol. Catat versinya dan SHA-256 di samping pembuatan aplikasi dan catatan perangkat.
Simpan API vendor di belakang adaptor pemindai sehingga logika bisnis dapat diuji unitnya tanpa perangkat keras dan implementasi penangkapan lainnya dapat diganti.
- Hanya sumber SDK yang disetujui
- Hash artefak dicatat
- Batas adaptor ditentukan
- Matriks perangkat dibuat
Miliki siklus hidup pemindai satu kali
Referensi API mendokumentasikan fungsi openScanner, closeScanner, startDecode, stopDecode dan mode keluaran. Putuskan apakah aktivitas, layanan latar depan, atau komponen cakupan aplikasi lainnya memiliki panggilan tersebut.
Hindari beberapa layar membuka pemindai secara terpisah. Jadikan penghentian dan penutupan aman untuk diulang dan tampilkan nilai pengembalian yang gagal dalam status diagnostik tanpa mencatat muatan kode batang.
- Pemilik sumber daya tunggal
- Pembersihan idempoten
- Nilai kembalian diamati
- Tidak ada muatan di log biasa
Validasi payload siaran
Siaran dekode yang berhasil dapat mencakup data mentah, string yang didekode, panjang, dan jenis kode batang. Periksa tindakan, nullability, dan panjangnya sebelum mengirimkan peristiwa domain.
Pilih satu representasi otoritatif. Jika pengkodean penting, pertahankan byte mentah dan dekode di bawah rangkaian karakter eksplisit alih-alih menganggap setiap kode batang adalah ASCII sederhana.
- Tindakannya sama persis
- Panjangnya konsisten dengan muatan
- Kebijakan pengkodean didokumentasikan
- Duplikat penjaga acara
Beralih dari bukti demo ke bukti produksi
Keberhasilan kompilasi hanya membuktikan kompatibilitas sumber. Jalankan aplikasi pada setiap model, OS, dan firmware yang diinginkan dengan label representatif dan skenario siklus hidup.
Rekam pengaturan pemindai dan mode keluaran setelah konfigurasi. Uji regresi setelah perubahan firmware, SDK, aplikasi, atau kebijakan MDM.
- Korpus pemindaian yang representatif
- Siklus tidur dan melanjutkan
- Kasus cepat dan kode panjang
- Catatan pengujian berversi
Peta status siklus hidup ScanManager
Jaga agar panggilan sumber daya tetap selaras dengan status aplikasi yang dapat diamati.
| Negara | Tindakan yang diperlukan | Respon kegagalan |
|---|---|---|
| Mulai | Buat ScanManager dan buka pemindai | Blokir pengambilan dan tampilkan status diagnostik |
| Siap | Atur mode keluaran dan daftarkan penerima | Baca kembali atau laporkan kegagalan konfigurasi |
| Menangkap | Mulai dekode atau terima peristiwa pemicu | Batas waktu, hentikan, dan izinkan percobaan ulang terkontrol |
| Dijeda | Hentikan dekode dan batalkan pendaftaran seperti yang dirancang | Cegah pengiriman ke alur kerja yang tidak aktif |
| Hancur | Tutup pemindai sekali | Rekam hasil pembersihan tanpa data sensitif |
Contoh Kotlin yang sadar siklus hidup minimal
Verifikasi konstanta mode keluaran, tanda penerima Android, dan kepemilikan siklus hidup terhadap SDK, target API, dan arsitektur aplikasi yang tepat.
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.device.ScanManager
import androidx.appcompat.app.AppCompatActivity
class UrovoScannerActivity : AppCompatActivity() {
private val scanner = ScanManager()
private var receiverRegistered = false
private val decodeReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action != ScanManager.ACTION_DECODE) return
val raw = intent.getByteArrayExtra(ScanManager.DECODE_DATA_TAG) ?: return
val declaredLength = intent.getIntExtra(ScanManager.BARCODE_LENGTH_TAG, raw.size)
val type = intent.getByteExtra(ScanManager.BARCODE_TYPE_TAG, 0)
val value = intent.getStringExtra(ScanManager.BARCODE_STRING_TAG)
?: raw.copyOf(declaredLength.coerceIn(0, raw.size)).toString(Charsets.UTF_8)
onValidatedScan(value, type)
}
}
override fun onStart() {
super.onStart()
check(scanner.openScanner()) { "Scanner could not be opened" }
// Confirm the broadcast-output constant in the SDK version you ship.
check(scanner.switchOutputMode(0)) { "Output mode could not be set" }
registerReceiver(decodeReceiver, IntentFilter(ScanManager.ACTION_DECODE))
receiverRegistered = true
}
override fun onStop() {
scanner.stopDecode()
if (receiverRegistered) unregisterReceiver(decodeReceiver)
receiverRegistered = false
scanner.closeScanner()
super.onStop()
}
private fun onValidatedScan(value: String, type: Byte) {
// Route a sanitized domain event; do not log sensitive barcode values.
}
}Daftar periksa validasi ScanManager
Lampirkan catatan ini ke aplikasi yang disetujui dan data dasar perangkat.
- 01
Versi SDK dan SHA-256 direkam
- 02
Perangkat SKU, OS dan firmware direkam
- 03
Pemindai membuka dan menutup berulang kali
- 04
Mode keluaran dibaca atau dikonfirmasi
- 05
Siklus hidup penerima cocok dengan UI aktif
- 06
Ekstra mentah, string, panjang, dan tipe dicentang
- 07
Semua simbologi yang diperlukan diuji
- 08
Pemindaian yang panjang, rusak, dan cepat diuji
- 09
Mode tidur, boot ulang, dan mode kios MDM diuji
- 10
Tidak ada data kode batang sensitif yang dicatat
Pertanyaan yang sering diajukan
Apa yang dimaksud dengan switchOutputMode(0) ?
Referensi API mendokumentasikan peralihan mode keluaran, tetapi konstanta dan perilaku harus diperiksa dalam rilis SDK dan firmware perangkat yang tepat. Jangan menyalin konstanta sampel ke dalam produksi tanpa verifikasi.
Haruskah pemindai ditutup saat onPause atau onStop?
Pilih kepemilikan siklus hidup berdasarkan arsitektur aplikasi dan apakah pemindaian dapat dilanjutkan ketika sebagian dikaburkan. Persyaratan penting adalah satu pemilik, pembersihan deterministik, dan perilaku teruji.
Bisakah sampel ini digunakan di setiap perangkat UROVO ?
Tidak. Ini adalah cetak biru validasi berdasarkan ScanManager v4.1.0326. Kompilasi dan jalankan pada setiap model, OS, dan firmware yang diinginkan sebelum dirilis.
Bukti dan keterbatasan
SDK-sampel yang didukung referensi/tidak divalidasi pada setiap konfigurasi target
Kode ini bersifat ilustratif dan sengaja menampilkan konstanta khusus versi dan kebijakan penerima Android untuk verifikasi.
Ditinjau: 2026-08-10
- UROVO Android SDK v4.1.0326 Referensi ScanManager API
- UROVO contoh proyek ScanManager dalam ekspor SDK yang disetujui
- Aplikasi Android dan dokumentasi siklus hidup penerima siaran

