Regla de implementación
Trate a ScanManager como un recurso de hardware con un propietario explícito. Ábralo, seleccione el modo de salida deseado, registre el receptor de decodificación, valide cada carga útil, luego cancele el registro y ciérrelo de manera determinista. Confirme el comportamiento del método en la muestra con intención de producción.
Prepare una línea base SDK reproducible
Empaquete el artefacto SDK aprobado a través del proceso de descarga controlado por desarrolladores. Registre su versión y SHA-256 junto con la compilación de la aplicación y el registro del dispositivo.
Mantenga las API del proveedor detrás de un adaptador de escáner para que la lógica empresarial pueda probarse unitariamente sin hardware y pueda sustituirse por otra implementación de captura.
- Fuente SDK aprobada únicamente
- Hash de artefacto registrado
- Límite del adaptador definido
- Matriz de dispositivos creada
Adquiera el ciclo de vida del escáner una vez
Los documentos de referencia API openScanner, closeScanner, startDecode, stopDecode y las funciones de modo de salida. Decida si la actividad, un servicio en primer plano u otro componente con ámbito de aplicación posee esas llamadas.
Evite que varias pantallas abran el escáner de forma independiente. Haga que detener y cerrar sea seguro para repetir y mostrar los valores de retorno fallidos en estado de diagnóstico sin registrar cargas útiles de códigos de barras.
- Propietario único del recurso
- limpieza idempotente
- Valores de retorno observados
- Sin cargas útiles en registros ordinarios
Validar la carga útil de transmisión
Una transmisión de decodificación exitosa puede incluir datos sin procesar, una cadena decodificada, longitud y tipo de código de barras. Verifique la acción, la nulidad y la duración antes de entregar un evento de dominio.
Elija una representación autorizada. Si la codificación es importante, conserve los bytes sin procesar y decodifique con un juego de caracteres explícito en lugar de asumir que cada código de barras es ASCII simple.
- La acción coincide exactamente
- Longitud acorde con la carga útil
- Política de codificación documentada
- Guardia de eventos duplicado
Pasar de la demostración a la evidencia de producción
El éxito de la compilación demuestra únicamente la compatibilidad de la fuente. Ejecute la aplicación en cada modelo, sistema operativo y firmware previstos con etiquetas representativas y escenarios de ciclo de vida.
Registre la configuración del escáner y el modo de salida después de la configuración. Prueba de regresión después de cambios en el firmware, SDK, aplicación o política MDM.
- Corpus de escaneo representativo
- Ciclos de sueño y reanudación.
- Casos de código rápido y largo
- Registro de prueba versionado
Mapa de estado del ciclo de vida de ScanManager
Mantenga las llamadas de recursos alineadas con el estado observable de la aplicación.
| Estado | Acción requerida | Respuesta de falla |
|---|---|---|
| Comenzando | Cree ScanManager y abra el escáner | Bloquear captura y mostrar estado de diagnóstico |
| Listo | Configurar el modo de salida y registrar el receptor | Volver a leer o informar de un error de configuración |
| Capturando | Iniciar decodificación o aceptar eventos desencadenantes | Tiempo de espera, detener y permitir un reintento controlado |
| En pausa | Detener la decodificación y cancelar el registro según lo diseñado | Evitar la entrega a un flujo de trabajo inactivo |
| destruido | Cerrar el escáner una vez | Registre el resultado de la limpieza sin datos confidenciales |
Ejemplo de ciclo de vida mínimo Kotlin
Verifique las constantes del modo de salida, los indicadores del receptor Android y la propiedad del ciclo de vida con el SDK exacto, el API objetivo y la arquitectura de la aplicación.
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.
}
}Lista de verificación de validación de ScanManager
Adjunte este registro a la aplicación aprobada y a la línea base del dispositivo.
- 01
Versión de SDK y SHA-256 registrados
- 02
Dispositivo SKU, sistema operativo y firmware registrados
- 03
El escáner se abre y cierra repetidamente
- 04
Modo de salida leído o confirmado
- 05
El ciclo de vida del receptor coincide con la interfaz de usuario activa
- 06
Extras sin procesar, cuerda, longitud y tipo marcados.
- 07
Todas las simbologías requeridas probadas
- 08
Escaneos largos, dañados y rápidos probados
- 09
Se prueba el modo de suspensión, reinicio y MDM quiosco
- 10
No se registran datos confidenciales de códigos de barras
Preguntas frecuentes
¿Qué significa switchOutputMode(0)?
La referencia API documenta el cambio del modo de salida, pero las constantes y el comportamiento deben verificarse en la versión exacta de SDK y en el firmware del dispositivo. No copie la constante de muestra en producción sin verificación.
¿Debería cerrarse el escáner en onPause o en onStop?
Elija la propiedad del ciclo de vida según la arquitectura de la aplicación y si el escaneo puede continuar cuando esté parcialmente oculto. El requisito importante es un propietario, limpieza determinista y comportamiento probado.
¿Se puede utilizar esta muestra en todos los dispositivos UROVO ?
No. Es un modelo de validación basado en ScanManager v4.1.0326. Compílelo y ejecútelo en cada modelo, sistema operativo y firmware previsto antes del lanzamiento.
Evidencia y limitaciones
SDK-muestra respaldada por referencia/no validada en cada configuración de destino
El código es ilustrativo y deliberadamente menciona constantes específicas de la versión y la política del receptor Android para su verificación.
Revisado: 2026-08-10
- UROVO Android SDK v4.1.0326 Referencia de ScanManager API
- UROVO Proyecto de muestra de ScanManager en exportación aprobada SDK
- Android documentación del ciclo de vida del receptor de transmisión y aplicación

