📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados na Especialização em Android Nativo. Recomendado revisar antes de iniciar.
v1.0 — Android Jetpack CameraX, ML Kit Barcode Scanning, Processamento de Imagens em Tempo Real e Mecânica de Captura
Série Prática Android Clássico — Projeto 8 de 21
- P07: Master Pokédex com Retrofit 2 & REST API
- ➡️ P08 (este): Batalha Scanner com CameraX & QR Code
- P09: PokeMap com Google Maps & GPS
- P10: Arena Social com Firebase Suite
- P11: Guilda dos Heróis com Navigation & Biometria
O projeto Batalha Scanner conecta o mundo físico ao ambiente virtual do jogo através do processamento óptico de códigos bidimensionais. Utilizando a biblioteca moderna Jetpack CameraX em conjunto com a API de ML Kit Barcode Scanning, o aplicativo gerencia o fluxo de vídeo da câmera traseira em tempo real no componente PreviewView, analisa frames assincronamente com ImageAnalysis e decodifica QR Codes para disparar batalhas e capturar criaturas.
Todos os serviços de câmera, analisadores de frames e interfaces residem na subpasta canônica mobile-android-kotlin/:
catalogo_projetos/android_p08_scanner_camerax/
├── assets/
│ ├── mockup_fluxo_telas.svg
│ ├── mockup_como_jogar.svg
│ ├── screenshot_01_permissao.svg
│ ├── screenshot_02_scanner_ativo.svg
│ ├── screenshot_03_batalha.svg
│ └── screenshot_04_gerador_pokeapi.svg
├── mobile-android-kotlin/
│ ├── app/
│ │ ├── src/
│ │ │ └── main/
│ │ │ ├── java/br/com/curso/batalhascanner/
│ │ │ │ ├── camera/
│ │ │ │ │ └── QrCodeAnalyzer.kt
│ │ │ │ └── MainActivity.kt
│ │ │ └── res/
│ │ └── build.gradle
│ ├── gradle/
│ ├── build.gradle
│ ├── gradlew
│ ├── settings.gradle
│ └── README.md
└── index.md
| ID | Persona | Narrativa da Funcionalidade | Critério de Aceitação Principal | Prioridade |
|---|---|---|---|---|
| US-01 | Jogador | Quero autorizar o acesso à câmera de forma clara através do diálogo de permissão em tempo de execução. | Solicitação nativa via ActivityResultContracts.RequestPermission. |
Alta |
| US-02 | Jogador | Quero apontar a câmera para um QR Code e ter a leitura realizada em fração de segundo. | Detecção automática pelo analisador ML Kit sem necessidade de tirar foto. | Alta |
| US-03 | Jogador | Quero ver uma mira com linhas neon sobre o leitor para enquadrar o código com precisão. | Overlay visual desenhado sobre o PreviewView do CameraX. |
Média |
| US-04 | Jogador | Quero que a tela mude para a arena de batalha imediatamente após a decodificação bem-sucedida. | Transição fluida para a tela de confronto com os dados da criatura lida. | Média |
| US-05 | Desenvolvedor Mobile | Quero liberar os recursos do hardware de câmera ao fechar o app para economizar bateria. | Encerramento automático dos casos de uso atrelados ao ciclo de vida da Activity. | Baixa |
Manifest.permission.CAMERA).ProcessCameraProvider do Jetpack CameraX com ciclo de vida atrelado à Activity.Preview projetado no elemento PreviewView.ImageAnalysis com STRATEGY_KEEP_ONLY_LATEST para leitura óptica contínua.BarcodeScanning.getClient()).ExecutorService dedicado sem impactar a UI.ImageProxy via imageProxy.close() para evitar travamento da fila.flowchart TD
Player([fa:fa-user Jogador])
Cam[(fa:fa-camera Hardware CameraX)]
MLKit[(fa:fa-barcode ML Kit Barcode)]
subgraph AppScanner ["📷 Batalha Scanner (mobile-android-kotlin)"]
UC01["Solicitar Permissão de Câmera"]
UC02["Exibir PreviewView em Tempo Real"]
UC03["Analisar Frame de Vídeo"]
UC04["Decodificar QR Code"]
UC05["Iniciar Duelo de Criaturas"]
end
Player --> UC01
UC01 -->|Concedida| UC02
UC02 --> Cam
Cam --> UC03
UC03 --> MLKit
MLKit -->|Payload Válido| UC04
UC04 --> UC05
| ID Requisito | História de Usuário | Artefato de Código | Teste de Aceitação |
|---|---|---|---|
| RF-01 | US-01 | mobile-android-kotlin/app/.../MainActivity.kt |
testCameraPermissionRequest() |
| RF-02 | US-05 | mobile-android-kotlin/app/.../MainActivity.kt |
testCameraProviderLifecycleBinding() |
| RF-03 | US-02 | mobile-android-kotlin/app/src/main/res/layout/activity_main.xml |
testPreviewViewInflated() |
| RF-04 | US-02 | mobile-android-kotlin/app/.../QrCodeAnalyzer.kt |
testImageAnalysisKeepOnlyLatest() |
| RF-05 | US-02, US-04 | mobile-android-kotlin/app/.../QrCodeAnalyzer.kt |
testMLKitBarcodeDetection() |
QrCodeAnalyzer.kt)ℹ️ O trecho de código que ficava aqui não correspondia ao código do projeto e foi retirado. Consulte os arquivos em
mobile-android-kotlin.
cd catalogo_projetos/android_p08_scanner_camerax/mobile-android-kotlin
./gradlew installDebug
| Checkpoint | Meta Técnica | Critério de Aceite | Status |
|---|---|---|---|
| CP-01 | Permissão Dinâmica | Fluxo de solicitação de permissão de câmera funcional | PASS ✅ |
| CP-02 | Inicialização do CameraX | PreviewView exibindo o feed da câmera a 30/60 FPS |
PASS ✅ |
| CP-03 | Integração com ML Kit | Leitura óptica de QR Codes com payload retornado | PASS ✅ |
| CP-04 | Transição de Tela | Abertura automática da tela de confronto pós-leitura | PASS ✅ |
| CP-05 | Suíte de Testes Automatizados | Testes de unidade e instrumentação aprovados com 100% de sucesso | PASS ✅ |