Crea una app de fitness básica

En esta guía, se explica cómo compilar una app básica de contador de pasos para dispositivos móviles, que es una base común para muchas apps de salud y fitness.

Este flujo de trabajo integra las siguientes APIs:

  • SensorManager para recuperar datos de pasos de un dispositivo móvil
  • Room para almacenar datos locales
  • Health Connect, para almacenar y compartir datos de salud y actividad física en el dispositivo.

Si deseas obtener asistencia adicional sobre la lectura de datos y las herramientas necesarias, consulta Cómo usar Android Sensor Manager para realizar un seguimiento de los pasos desde un dispositivo móvil.

Si aún no configuraste tu entorno de desarrollo para usar Health Connect, sigue estos pasos para comenzar.

Cómo solicitar permisos en el dispositivo de mano

Antes de obtener los datos de ejercicio, debes solicitar y obtener los permisos correspondientes.

Como práctica recomendada, solicita únicamente los permisos que necesites y asegúrate de solicitar cada uno en contexto, en lugar de solicitar todos a la vez cuando el usuario inicia la app.

El sensor del contador de pasos, del que dependen muchas apps de ejercicio, usa el permiso ACTIVITY_RECOGNITION. Agrega este permiso en el archivo AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools">

  <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>

</manifest>

Para solicitar el permiso ACTIVITY_RECOGNITION durante el tiempo de ejecución, consulta la documentación de solicitud de permisos.

También deberás declarar un FOREGROUND_SERVICE en el manifiesto. Dado que solicitas el permiso ACTIVITY_RECOGNITION, declara FOREGROUND_SERVICE_TYPE_HEALTH:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_HEALTH"/>

Visita Servicios en primer plano para obtener más información sobre los servicios en primer plano y los tipos de servicios en primer plano.

Cómo administrar el estado de la IU con un ViewModel

Para administrar correctamente el estado de la IU, usa un ViewModel. Jetpack Compose y ViewModels te ofrecen una visión más detallada de este flujo de trabajo.

Además, usa las capas de IU, que son una parte fundamental para compilar IUs con Compose y te permite seguir las prácticas recomendadas de arquitectura, como el flujo unidireccional de datos. Para obtener más información sobre las capas de la IU, consulta la documentación sobre las capas de la IU.

En esta app de ejemplo, la IU tiene tres estados básicos:

  • Cargando: se muestra un círculo que gira.
  • Contenido: Muestra información sobre tus pasos del día de hoy.
  • Error: Muestra un mensaje cuando algo sale mal.

ViewModel expone estos estados como un Flow de Kotlin. Usa una clase sellada para contener las clases y los objetos que representan los estados posibles:

class TodayScreenViewModel(...) {

  val currentScreenState: MutableStateFlow<TodayScreenState> = MutableStateFlow(Loading)

  [...]

}

sealed class TodayScreenState {
    data object Loading : TodayScreenState()
    data class Content(val steps: Long, val dailyGoal: Long) : TodayScreenState()
    data object Error: TodayScreenState()
}

Luego, la IU de Compose recopila este Flow como un State de Compose y actúa en él:

val state: TodayScreenState = todayScreenViewModel.currentScreenState.collectAsState().value