Regra de implementação
Trate o ScanManager como um recurso de hardware com um proprietário explícito. Abra-o, selecione o modo de saída pretendido, registre o receptor de decodificação, valide cada carga útil, cancele o registro e feche de forma determinística. Confirme o comportamento do método na amostra de intenção de produção.
Prepare uma linha de base SDK reproduzível
Empacote o artefato SDK aprovado por meio do processo controlado de download do desenvolvedor. Registre sua versão e SHA-256 junto com a compilação do aplicativo e o registro do dispositivo.
Mantenha as APIs do fornecedor atrás de um adaptador de scanner para que a lógica de negócios possa ser testada em unidade sem hardware e outra implementação de captura possa ser substituída.
- Somente fonte SDK aprovada
- Hash de artefato registrado
- Limite do adaptador definido
- Matriz de dispositivos criada
Possuir o ciclo de vida do scanner uma vez
A referência API documenta funções openScanner, closeScanner, startDecode, stopDecode e modo de saída. Decida se a atividade, um serviço em primeiro plano ou outro componente com escopo de aplicativo possui essas chamadas.
Evite múltiplas telas abrindo o scanner de forma independente. Torne a parada e o fechamento seguros para repetir e exibir valores de retorno com falha no estado de diagnóstico sem registrar cargas úteis de código de barras.
- Proprietário de recurso único
- Limpeza idempotente
- Valores de retorno observados
- Nenhuma carga útil em logs comuns
Valide a carga de transmissão
Uma transmissão de decodificação bem-sucedida pode incluir dados brutos, uma string decodificada, comprimento e tipo de código de barras. Verifique a ação, a nulidade e a duração antes de entregar um evento de domínio.
Escolha uma representação oficial. Se a codificação for importante, preserve os bytes brutos e decodifique sob um conjunto de caracteres explícito em vez de assumir que cada código de barras é ASCII simples.
- A ação corresponde exatamente
- Comprimento consistente com a carga útil
- Política de codificação documentada
- Guarda de evento duplicado
Passe da demonstração para a evidência de produção
O sucesso da compilação prova apenas a compatibilidade da fonte. Execute o aplicativo em cada modelo, sistema operacional e firmware pretendido com rótulos representativos e cenários de ciclo de vida.
Registre as configurações do scanner e o modo de saída após a configuração. Teste de regressão após alterações de firmware, SDK, aplicativo ou política MDM.
- Corpus de digitalização representativo
- Dormir e retomar ciclos
- Casos de código rápido e longo
- Registro de teste versionado
Mapa do estado do ciclo de vida do ScanManager
Mantenha as chamadas de recursos alinhadas com o estado observável do aplicativo.
| Estado | Ação necessária | Resposta à falha |
|---|---|---|
| Começando | Crie o ScanManager e abra o scanner | Bloquear captura e mostrar estado de diagnóstico |
| Pronto | Defina o modo de saída e registre o receptor | Leia ou relate falha na configuração |
| Capturando | Inicie a decodificação ou aceite eventos de gatilho | Tempo limite, parar e permitir nova tentativa controlada |
| Pausado | Pare a decodificação e cancele o registro conforme projetado | Impedir a entrega para fluxo de trabalho inativo |
| Destruído | Feche o scanner uma vez | Registre o resultado da limpeza sem dados confidenciais |
Exemplo de reconhecimento mínimo do ciclo de vida Kotlin
Verifique as constantes do modo de saída, os sinalizadores do receptor Android e a propriedade do ciclo de vida em relação ao SDK, ao destino API exato e à arquitetura do aplicativo.
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 verificação de validação do ScanManager
Anexe esse registro ao aplicativo aprovado e à linha de base do dispositivo.
- 01
Versão SDK e SHA-256 gravado
- 02
Dispositivo SKU, SO e firmware gravados
- 03
O scanner abre e fecha repetidamente
- 04
Modo de saída lido ou confirmado
- 05
O ciclo de vida do receptor corresponde à UI ativa
- 06
Extras brutos, string, comprimento e tipo verificados
- 07
Todas as simbologias necessárias testadas
- 08
Varreduras longas, danificadas e rápidas testadas
- 09
Suspensão, reinicialização e modo quiosque MDM testado
- 10
Nenhum dado sensível de código de barras registrado
Perguntas frequentes
O que significa switchOutputMode(0)?
A referência API documenta a comutação do modo de saída, mas as constantes e o comportamento devem ser verificados na versão exata SDK e no firmware do dispositivo. Não copie a constante de amostra na produção sem verificação.
O scanner deve fechar em onPause ou onStop?
Escolha a propriedade do ciclo de vida com base na arquitetura do aplicativo e se a verificação pode continuar quando parcialmente ocultada. O requisito importante é um proprietário, limpeza determinística e comportamento testado.
Este exemplo pode ser usado em todos os dispositivos UROVO ?
Não. É um modelo de validação baseado no ScanManager v4.1.0326. Compile e execute-o em cada modelo, sistema operacional e firmware pretendido antes do lançamento.
Evidências e limitações
SDKamostra apoiada por referência/não validada em todas as configurações de destino
O código é ilustrativo e chama deliberadamente constantes específicas da versão e política do receptor Android para verificação.
Revisado: 2026-08-10
- UROVO Android SDK referência v4.1.0326 ScanManager API
- UROVO Projeto de amostra do ScanManager na exportação aprovada SDK
- Android documentação do ciclo de vida do aplicativo e do receptor de transmissão

