📷 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
- CameraX: É a biblioteca oficial do Google para facilitar o uso da câmera.
- ML Kit: É o “Cérebro” de visão do Google. Ele consegue ler textos, rostos e QR Codes.
- Permissões: Por segurança, o Android proíbe o uso da câmera sem que o usuário autorize. Você precisa pedir “licença” no arquivo de manifesto.
🎨 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):
- Envie o print do seu Manifesto com a permissão.
- Envie o código das funções
validarIngressoeescanearMoeda. - Submeta no canal de tarefas.