🧩 Exercícios - Cap 16: Captura QR: Scanner de Itens

📖 Ver Cap 16

🎯 Antes de começar

No Cap 16 você declarou a permissão de câmera no AndroidManifest.xml, criou validarIngresso (com if/else) e escanearMoeda (verificando "POKE_MOEDA"). Depois de completar as três Práticas, faça o exercício extra abaixo para reconhecer vários itens diferentes em um único scanner, usando when (Cap 05).


💪 Exercício Extra 1: Inventário de Itens via QR com when (20 min)

Objetivo: Praticar when para transformar o rawValue de um código QR em diferentes itens do jogo, em vez de checar apenas um valor com if.

Passos:

  1. Crie a função processarItem:
    fun processarItem(codigo: String): String {
        return when (codigo) {
            "POKE_BOLA" -> "📦 Você ganhou uma Pokebola!"
            "SUPER_BOLA" -> "📦📦 Você ganhou uma Super Bola!"
            "POKE_MOEDA" -> "🪙 Você ganhou 100 moedas!"
            else -> "❌ Código não reconhecido."
        }
    }
    
  2. Crie escanearInventario, baseada em escanearImagem, que chama processarItem para cada código encontrado:
    fun escanearInventario(imagem: InputImage) {
        val scanner = BarcodeScanning.getClient()
    
        scanner.process(imagem)
            .addOnSuccessListener { codigosEncontrados ->
                for (codigo in codigosEncontrados) {
                    val valorLido = codigo.rawValue ?: ""
                    println(processarItem(valorLido))
                }
            }
            .addOnFailureListener {
                println("❌ Erro ao ler o código.")
            }
    }
    
  3. Para testar sem câmera, simule os códigos encontrados com uma lista:
    val codigosDeTeste = listOf("POKE_BOLA", "SUPER_BOLA", "POKE_MOEDA", "ITEM_RARO")
    for (c in codigosDeTeste) {
        println(processarItem(c))
    }
    

✅ Resultado Esperado

📦 Você ganhou uma Pokebola!
📦📦 Você ganhou uma Super Bola!
🪙 Você ganhou 100 moedas!
❌ Código não reconhecido.

🆘 Resolução de Problemas Comuns

Erro Causa Solução
'when' expression must be exhaustive Faltou o ramo else -> no when Sempre inclua else -> "❌ Código não reconhecido." como último ramo
Código "poke_bola" (minúsculo) não é reconhecido when é sensível a maiúsculas/minúsculas, e o QR Code real pode vir em outro formato Padronize com codigo.uppercase() antes do when, ou garanta que os QR Codes gerados usem exatamente "POKE_BOLA"
Type mismatch nos ramos do when Um dos ramos retorna Int ou outro tipo, em vez de String Garanta que todos os ramos do when retornem String

⬅️ Voltar para Exercícios