📷 Cap 16: Captura QR: Scanner de Itens

🎯 Objetivo da Aula: Ao final desta aula, você saberá usar a câmera do celular no seu app. Você aprenderá a integrar o Google ML Kit para ler QR Codes, permitindo que o jogador escaneie códigos no mundo real para ganhar itens no jogo.


🏢 O Cenário Prático (Seu Desafio): Você quer criar um evento de “Caça ao Tesouro”. O desafio é fazer o celular identificar quando o jogador aponta a câmera para um QR Code específico. Se o código for POKE_BOLA, o app deve dar o item para o jogador.


🧠 Fundamentos: A Teoria Traduzida

📖 Dicionário do Programador

🎨 Padrão de Permissões

Todas as permissões do sistema devem ser declaradas no arquivo AndroidManifest.xml antes de serem usadas no código Kotlin.

graph TD
    A["Usuário abre Câmera"] --> B{Tem Permissão?}
    B -->|Não| C["Mostra Janela de Pedido"]
    B -->|Sim| D["Abre Scanner QR"]

🏗️ Construindo o Projeto (Checklist Studio)

No seu arquivo AndroidManifest.xml, adicione esta linha antes da tag <application>: <uses-permission android:name="android.permission.CAMERA" />


📦 Dependência Gradle

Para usar o leitor de QR Code do ML Kit, adicione no build.gradle (Module: app), dentro de dependencies { }:

implementation("com.google.mlkit:barcode-scanning:17.2.0")

📦 Imports Necessários

Antes de copiar os códigos abaixo, adicione estes imports no topo do seu arquivo .kt:

import com.google.mlkit.vision.barcode.BarcodeScanning
import com.google.mlkit.vision.common.InputImage

📖 Exemplo Passo a Passo: O Verificador de Itens

Parte 1 — A Lógica: crie uma função simples para validar o que a câmera leu:

fun processarCodigo(textoLido: String) {
    if (textoLido == "POKE_BOLA") {
        println("📦 Você ganhou uma Pokebola!")
    } else {
        println("❌ Código inválido ou item desconhecido.")
    }
}

Parte 2 — O Scanner Real (ML Kit): o ML Kit recebe uma imagem da câmera (InputImage) e devolve a lista de códigos encontrados. Para cada código, pegamos o rawValue (o texto) e mandamos para a função processarCodigo:

fun escanearImagem(imagem: InputImage) {
    val scanner = BarcodeScanning.getClient()

    scanner.process(imagem)
        .addOnSuccessListener { codigosEncontrados ->
            for (codigo in codigosEncontrados) {
                val valorLido = codigo.rawValue ?: ""
                processarCodigo(valorLido)
            }
        }
        .addOnFailureListener {
            println("❌ Erro ao ler o código.")
        }
}

🛠️ Prática Obrigatória 1: Abra o arquivo AndroidManifest.xml do seu projeto e adicione a permissão de câmera mostrada acima.


🛠️ Prática Obrigatória 2: Crie uma função chamada validarIngresso. Se o texto lido for "VIP", o retorno deve ser "Acesso Liberado". Senão, o retorno deve ser "Acesso Negado".


🛠️ Prática Obrigatória 3: Usando escanearImagem como referência, crie a função escanearMoeda(imagem: InputImage). Para cada código encontrado, se o rawValue for "POKE_MOEDA", mostre println("🪙 Você ganhou 100 moedas!"); senão, mostre println("❌ Código não reconhecido.").


🔑 Gabarito Passo a Passo:

Exercício 2:

fun validarIngresso(codigo: String): String {
    return if (codigo == "VIP") {
        "Acesso Liberado"
    } else {
        "Acesso Negado"
    }
}

Exercício 3:

fun escanearMoeda(imagem: InputImage) {
    val scanner = BarcodeScanning.getClient()

    scanner.process(imagem)
        .addOnSuccessListener { codigosEncontrados ->
            for (codigo in codigosEncontrados) {
                if (codigo.rawValue == "POKE_MOEDA") {
                    println("🪙 Você ganhou 100 moedas!")
                } else {
                    println("❌ Código não reconhecido.")
                }
            }
        }
        .addOnFailureListener {
            println("❌ Erro ao ler o código.")
        }
}

📤 Instruções de Entrega (Microsoft Teams):

  1. Envie o print do seu Manifesto com a permissão.
  2. Envie o código das funções validarIngresso e escanearMoeda.
  3. Submeta no canal de tarefas.

⬅️ Voltar para a Home