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 el almacenamiento de datos locales
  • Health Connect para almacenar y compartir datos de salud y actividad física en el dispositivo

Para obtener asistencia adicional sobre la lectura de datos y las herramientas necesarias, consulta Cómo usar Android Sensor Manager para hacer 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.

Solicita permisos en un dispositivo portátil

Antes de obtener datos de actividad física, debes solicitar y obtener los permisos correspondientes.

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

El sensor de contador de pasos, en el que se basan muchas apps de ejercicios, usa el permiso ACTIVITY_RECOGNITION. Agrega este permiso en tu 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 en el tiempo de ejecución, consulta la documentación sobre la solicitud de permisos.

También deberás declarar un FOREGROUND_SERVICE en el manifiesto. Como 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.

Administra el estado de la IU con un ViewModel

Para administrar correctamente el estado de la IU, usa un ViewModel. Jetpack Compose y ViewModels te ofrece una mirada más profunda a este flujo de trabajo.

Además, usa capas de IU, que son una parte fundamental para compilar IU con Compose y te permiten 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 la capa de la IU.

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

  • Cargando: Muestra un círculo giratorio.
  • Contenido: Muestra información sobre tus pasos del día.
  • Error: Muestra un mensaje cuando algo sale mal.

El 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 consecuencia:

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