Contenido del curso
Google Maps SDK
Servicios de Localización
- 7

Kotlin Flows para medir tiempo en Android
12:54 min - 8

Simulación de ubicación GPS en emulador y dispositivo Android
05:48 min - 9

Modelos de localización propios con Clean Architecture
Viendo ahora - 10

Callbacks de Android convertidos en Flows
14:50 min - 11

Inyección de dependencias para observar localización en Android
06:33 min - 12

LocationTracker con StateFlow para rastreo en Android
08:46 min - 13

State Flows para controlar localización y tiempo en Kotlin
10:00 min - 14

Configuración y pruebas de Location Tracker en Android
09:37 min
Integración Maps con Localización
Manejo de permisos
Integración cámara
- 23

Cómo guardar fotos en Android con PhotoHandler
11:59 min - 24

Conversión de Bitmaps a Byte Arrays con Extension Functions
05:58 min - 25

CameraViewModel con Hilt y StateFlow
08:40 min - 26

Configuración de métodos del ViewModel para gestión de cámara
09:40 min - 27

Integración de CameraX con Jetpack Compose en Android
14:23 min - 28

Creación de pantalla de previsualización de fotos con Jetpack Compose
08:44 min - 29

Galería de fotos en marcadores del mapa
11:55 min
Servicios en Android
Transmisiones en Android (Broadcast)
Modelos de localización propios con Clean Architecture
Resumen
Modelar datos de ubicación con Clean Architecture en Kotlin te permite desacoplar tu app de las librerías de Google y manejar coordenadas, distancias y tiempos como objetos propios del dominio. Esto es clave si construyes apps de tracking, fitness o navegación que necesitan ser mantenibles y testeables.
A continuación encontrarás cómo estructurar las data classes de localización, calcular distancias considerando la curvatura terrestre y preparar el terreno para integrar fotos y timestamps dentro del recorrido.
¿Por qué crear modelos propios de localización en lugar de usar los de Google?
Las bases de Clean Architecture te piden que tu capa de domain no dependa de librerías externas. Por eso, antes de tocar Google Play Services, defines tus propios objetos dentro de la carpeta domain/location.
¿Qué necesita una clase Location mínima?
Lo mínimo viable para representar una ubicación son dos coordenadas. Creas una data class llamada Location con dos propiedades tipo double: latitud y longitud.
¿Qué es una data class en Kotlin? Es una clase pensada para almacenar datos. Kotlin genera automáticamente métodos como
equals,hashCodeycopy, lo que la hace ideal para modelos de dominio.
Dentro de esta misma clase agregas funciones que calculan la distancia entre un punto y otro tomando en cuenta la curvatura de la Tierra. Para ello importas las funciones sin, cos y sqrt de la librería matemática de Kotlin, y defines el diámetro terrestre como constante: 6.371.000 metros.
La lógica trigonométrica es compleja, pero lo importante es entender qué hace: recibe dos coordenadas y devuelve los metros que las separan en línea curva sobre la superficie del planeta.
¿Cómo asociar una ubicación con su momento exacto en el tiempo?
Una coordenada sola no cuenta toda la historia. Para reconstruir un recorrido necesitas saber cuándo se capturó cada punto.
¿Qué guarda LocationWithTimestamp?
Creas una segunda data class llamada LocationWithTimestamp que combina:
- El objeto
Locationcon sus coordenadas. - El timestamp o duración en que esa localización fue emitida.
- Una lista de fotos tomadas en ese punto y momento.
Aquí es donde el trabajo previo con timers cobra valor. La lista de fotos queda declarada desde ya para no olvidar implementarla más adelante, aunque su lógica completa se aborda en clases posteriores.
¿Cómo representar un recorrido completo con pausas?
Un recorrido real no es una línea continua. El usuario puede pausar el tracking para tomar una foto y luego reanudarlo. Tu modelo debe reflejar eso.
¿Por qué LocationData usa una lista de listas?
La data class LocationData es el objeto principal que expone toda la información del recorrido. Contiene:
distanceMeters: unintcon la distancia total acumulada.locations: una lista de listas deLocationWithTimestamp, inicializada como empty list.
¿Por qué una lista de listas? Porque cada vez que activas la cámara, pausas el tracking. Ese primer tramo, del punto A hasta donde tomaste la foto, forma el primer pack de localizaciones. Cuando reanudas, se abre un segundo pack. Así, cada sublista representa un segmento continuo del recorrido.
¿Qué ventaja tiene agrupar ubicaciones en packs? Te permite calcular distancias por tramo sin contaminar el total con saltos artificiales causados por pausas de la cámara.
¿Cómo calcular la distancia total recorrida en Kotlin?
Para aislar las operaciones complejas, creas una clase llamada LocationCalculations. Su responsabilidad es procesar el array de ubicaciones y devolver métricas útiles.
¿Qué hace getTotalDistanceMeters?
La función getTotalDistanceMeters recibe la lista de listas de LocationWithTimestamp y retorna la distancia total. La lógica usa varios operadores de Kotlin encadenados:
sumOfpara sumar resultados de cada sublista.zipWithNextpara emparejar cada punto con el siguiente y formar pareslocation1ylocation2.distanceTopara calcular los metros entre cada par.roundToIntpara convertir el resultado final a entero.
El operador zipWithNext es la clave: agrupa elementos consecutivos en pares, justo lo que necesitas para medir tramo a tramo. Sin él, tendrías que escribir un bucle manual con índices.
Esta arquitectura te deja con acceso limpio a la localización y al tiempo desde tus modelos de dominio, sin acoplarte aún a ninguna librería externa.
¿Qué reto puedes resolver con LocationCalculations?
Dentro de la clase LocationCalculations queda abierto un reto: implementar una función que calcule la velocidad entre dos puntos. Tienes todos los ingredientes a mano: la distancia (vía distanceTo) y el tiempo (vía los timestamps de cada LocationWithTimestamp).
La fórmula es directa: velocidad igual a distancia sobre tiempo. Lo interesante está en decidir las unidades, manejar pausas y exponer el resultado de forma limpia.
En la siguiente entrega verás cómo empalmar estos modelos con lo que provee Google Play Services para que tu app reciba ubicaciones reales del dispositivo. ¿Cómo resolverías tú el cálculo de velocidad? Cuéntalo en los comentarios.