Instruções Gerais:

  • Resolva as atividades em ordem progressiva de maturidade.
  • Cada nível adiciona requisitos técnicos, tratamento de erros e casos de borda reais.
  • Consulte o gabarito comentado ao final de cada questão para autoavaliação.

🎯 Nível 1: Fundamentos

Problema 18.1 — Solicitação de Permissões com rememberPermissionState (Accompanist)

Contexto: Solicitação de Permissões com rememberPermissionState (Accompanist) no contexto de Permissões em Tempo de Execução, Câmera e GPS.

Requisitos de Execução:

  1. Solicitar permissão de câmera e exibir mensagem caso o acesso seja negado.

Resultado Esperado

Permissão de runtime gerenciada com fluxo declarativo no Compose.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_18_1_SeuNome
  2. Envie na tarefa: Atividade Cap 18 - Permissões em Tempo de Execução, Câmera e GPS
🔑 Gabarito de Código & Solução Comentada
package com.empresa.mobile.permissions

import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable

@Composable
fun SolicitadorPermissaoCamera(onPermitido: () -> Unit) {
    Button(onClick = onPermitido) {
        Text("Permitir Acesso a Camera")
    }
}

🔍 Nível 2: Prática

Problema 18.2 — Captura de Fotos com ActivityResultContracts.TakePicturePreview()

Contexto: Captura de Fotos com ActivityResultContracts.TakePicturePreview() no contexto de Permissões em Tempo de Execução, Câmera e GPS.

Requisitos de Execução:

  1. Abrir câmera nativa e recuperar bitmap capturado diretamente no Compose.

Resultado Esperado

Integração nativa com câmera utilizando Activity Result API.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_18_2_SeuNome
  2. Envie na tarefa: Atividade Cap 18 - Permissões em Tempo de Execução, Câmera e GPS
🔑 Gabarito de Código & Solução Comentada
package com.empresa.mobile.camera

import android.graphics.Bitmap
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.*

@Composable
fun CapturaFotoSimples() {
    var fotoBitmap by remember { mutableStateOf<Bitmap?>(null) }
    val launcher = rememberLauncherForActivityResult(
        contract = ActivityResultContracts.TakePicturePreview()
    ) { bitmap -> fotoBitmap = bitmap }

    Button(onClick = { launcher.launch(null) }) {
        Text(if (fotoBitmap != null) "Foto Capturada!" else "Tirar Foto")
    }
}

⚡ Nível 3: Integração

Problema 18.3 — Localização Geográfica em Tempo Real com FusedLocationProviderClient

Contexto: Localização Geográfica em Tempo Real com FusedLocationProviderClient no contexto de Permissões em Tempo de Execução, Câmera e GPS.

Requisitos de Execução:

  1. Obter latitude e longitude atual do dispositivo utilizando Google Play Services Location.

Resultado Esperado

Coordenadas de GPS obtidas com alta precisão.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_18_3_SeuNome
  2. Envie na tarefa: Atividade Cap 18 - Permissões em Tempo de Execução, Câmera e GPS
🔑 Gabarito de Código & Solução Comentada
package com.empresa.mobile.location

import android.annotation.SuppressLint
import android.content.Context
import com.google.android.gms.location.LocationServices

@SuppressLint("MissingPermission")
fun obterCoordenadasGPS(context: Context, onLocation: (Double, Double) -> Unit) {
    val client = LocationServices.getFusedLocationProviderClient(context)
    client.lastLocation.addOnSuccessListener { loc ->
        if (loc != null) onLocation(loc.latitude, loc.longitude)
    }
}

🏆 Nível 4: Desafio Corporativo

Problema 18.4 — Auditoria de Acesso a Recursos Sensíveis com Trilha de Auditoria

Contexto: Auditoria de Acesso a Recursos Sensíveis com Trilha de Auditoria no contexto de Permissões em Tempo de Execução, Câmera e GPS.

Requisitos de Execução:

  1. Registrar em log auditado cada acesso à câmera e localização com timestamp e ID do operador.

Resultado Esperado

Trilha de conformidade LGPD/GDPR para recursos nativos sensíveis.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_18_4_SeuNome
  2. Envie na tarefa: Atividade Cap 18 - Permissões em Tempo de Execução, Câmera e GPS
🔑 Gabarito de Código & Solução Comentada
package com.empresa.mobile.security

import java.time.Instant

data class RegistroAcessoRecurso(val recurso: String, val timestamp: Instant, val concedido: Boolean)

object AuditoriaRecursosNativos {
    private val registros = mutableListOf<RegistroAcessoRecurso>()

    fun registrar(recurso: String, ok: Boolean) {
        registros.add(RegistroAcessoRecurso(recurso, Instant.now(), ok))
        println("Auditoria de Seguranca: Acesso a '$recurso' -> Concedido: $ok")
    }
}

fun main() {
    AuditoriaRecursosNativos.registrar("GPS", true)
}

⬅️ Voltar ao Índice de Exercícios 📚 Sumário de Tópicos