Règle de mise en œuvre
Traitez ScanManager comme une ressource matérielle avec un propriétaire explicite. Ouvrez-le, sélectionnez le mode de sortie souhaité, enregistrez le récepteur de décodage, validez chaque charge utile, puis désenregistrez-vous et fermez de manière déterministe. Confirmez le comportement de la méthode sur l’échantillon d’intention de production.
Préparer une référence reproductible de SDK
Packagez l'artefact SDK approuvé via le processus de téléchargement contrôlé par le développeur. Enregistrez sa version et SHA-256 aux côtés de la version de l'application et de l'enregistrement de l'appareil.
Conservez les API du fournisseur derrière un adaptateur de scanner afin que la logique métier puisse être testée unitairement sans matériel et qu'une autre implémentation de capture puisse être remplacée.
- Source SDK approuvée uniquement
- Hachage d'artefact enregistré
- Limite de l'adaptateur définie
- Matrice d'appareils créée
Posséder le cycle de vie du scanner une fois
Les documents de référence API openScanner, closeScanner, startDecode, stopDecode et les fonctions du mode de sortie. Décidez si l’activité, un service de premier plan ou un autre composant au niveau de l’application est propriétaire de ces appels.
Évitez que plusieurs écrans n’ouvrent le scanner indépendamment. Assurez l'arrêt et la fermeture en toute sécurité pour répéter et faire apparaître les valeurs de retour échouées dans l'état de diagnostic sans enregistrer les charges utiles des codes-barres.
- Propriétaire de ressource unique
- Nettoyage idempotent
- Valeurs de retour observées
- Aucune charge utile dans les journaux ordinaires
Valider la charge utile de diffusion
Une diffusion de décodage réussie peut inclure des données brutes, une chaîne décodée, une longueur et un type de code-barres. Vérifiez l'action, la nullité et la longueur avant de diffuser un événement de domaine.
Choisissez une représentation faisant autorité. Si l'encodage est important, conservez les octets bruts et décodez sous un jeu de caractères explicite au lieu de supposer que chaque code-barres est un simple ASCII.
- L'action correspond exactement
- Longueur conforme à la charge utile
- Politique d'encodage documentée
- Garde d'événements en double
Passer des preuves de démonstration aux preuves de production
Le succès de la compilation prouve uniquement la compatibilité des sources. Exécutez l'application sur chaque modèle, système d'exploitation et micrologiciel prévus avec des étiquettes représentatives et des scénarios de cycle de vie.
Enregistrez les paramètres du scanner et le mode de sortie après la configuration. Test de régression après des modifications du micrologiciel, de SDK, de l'application ou de la stratégie MDM.
- Corpus d'analyse représentatif
- Cycles de sommeil et de reprise
- Cas de code rapide et long
- Dossier de test versionné
Carte d'état du cycle de vie de ScanManager
Gardez les appels de ressources alignés sur l’état observable de l’application.
| État | Action requise | Réponse à l'échec |
|---|---|---|
| Démarrage | Créez ScanManager et ouvrez le scanner | Bloquer la capture et afficher l'état du diagnostic |
| Prêt | Définir le mode de sortie et enregistrer le récepteur | Relisez ou signalez un échec de configuration |
| Capturer | Démarrer le décodage ou accepter les événements déclencheurs | Expiration du délai, arrêt et autorisation d'une nouvelle tentative contrôlée |
| En pause | Arrêtez le décodage et désinscrivez-vous comme prévu | Empêcher la livraison vers un workflow inactif |
| Détruit | Fermez le scanner une fois | Enregistrer le résultat du nettoyage sans données sensibles |
Exemple de Kotlin prenant en compte le cycle de vie minimal
Vérifiez les constantes du mode de sortie, les indicateurs du récepteur Android et la propriété du cycle de vie par rapport au SDK exact, à la cible API et à l'architecture de l'application.
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.
}
}Liste de contrôle de validation du ScanManager
Joignez cet enregistrement à l’application approuvée et à la référence de l’appareil.
- 01
Version SDK et SHA-256 enregistrés
- 02
Appareil SKU, système d'exploitation et micrologiciel enregistrés
- 03
Le scanner s'ouvre et se ferme à plusieurs reprises
- 04
Mode de sortie lu ou confirmé
- 05
Le cycle de vie du récepteur correspond à l'interface utilisateur active
- 06
Extras bruts, chaînes, longueur et type vérifiés
- 07
Toutes les symbologies requises testées
- 08
Analyses longues, endommagées et rapides testées
- 09
Mode veille, redémarrage et mode kiosque MDM testés
- 10
Aucune donnée de code-barres sensible enregistrée
Questions fréquemment posées
Que signifie switchOutputMode(0) ?
La référence API documente la commutation du mode de sortie, mais les constantes et le comportement doivent être vérifiés dans la version exacte de SDK et dans le micrologiciel de l'appareil. Ne copiez pas la constante échantillon en production sans vérification.
Le scanner doit-il se fermer en onPause ou onStop ?
Choisissez la propriété du cycle de vie en fonction de l'architecture de l'application et de la possibilité de poursuivre l'analyse lorsqu'elle est partiellement masquée. L'exigence importante est un propriétaire unique, un nettoyage déterministe et un comportement testé.
Cet exemple peut-il être utilisé sur chaque appareil UROVO ?
Non. Il s'agit d'un plan de validation basé sur ScanManager v4.1.0326. Compilez-le et exécutez-le sur chaque modèle, système d'exploitation et firmware prévu avant sa sortie.
Preuves et limites
SDK-échantillon basé sur une référence/non validé sur chaque configuration cible
Le code est illustratif et appelle délibérément les constantes spécifiques à la version et la stratégie du récepteur Android pour vérification.
Révisé: 2026-08-10
- Référence de UROVO Android SDK v4.1.0326 ScanManager API
- UROVO Exemple de projet ScanManager dans l'exportation SDK approuvée
- Documentation sur le cycle de vie de l'application et du récepteur de diffusion Android

