Criar um app básico de condicionamento físico

Este guia mostra como criar um app básico de contador de passos para dispositivos móveis, que é uma base comum para muitos apps de saúde e fitness.

Esse fluxo de trabalho integra as seguintes APIs:

  • SensorManager para recuperar dados de etapas de um dispositivo móvel.
  • Room para armazenamento local de dados.
  • Conexão Saúde para armazenar e compartilhar dados de saúde e fitness no dispositivo.

Para mais suporte sobre leitura de dados e as ferramentas necessárias, consulte Usar o Android Sensor Manager para rastrear etapas de um dispositivo móvel.

Se você ainda não configurou seu ambiente de desenvolvimento para usar a Conexão Saúde, siga estas etapas de primeiros passos.

Solicitar permissões em dispositivos móveis

Antes de receber dados de exercícios, você precisa solicitar e receber as permissões adequadas.

Como prática recomendada, solicite apenas as permissões necessárias e faça isso no contexto, em vez de pedir todas as permissões de uma vez quando o usuário iniciar o app.

O sensor de contador de passos, usado por muitos apps de exercícios, usa a permissão ACTIVITY_RECOGNITION. Adicione esta permissão ao arquivo 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 a permissão ACTIVITY_RECOGNITION no momento da execução, consulte a documentação de solicitação de permissão.

Você também precisa declarar um FOREGROUND_SERVICE no manifesto. Como você está solicitando a permissão ACTIVITY_RECOGNITION, declare FOREGROUND_SERVICE_TYPE_HEALTH:

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

Acesse Serviços em primeiro plano para saber mais sobre os serviços e tipos de serviços em primeiro plano.

Gerenciar o estado da interface usando um ViewModel

Para gerenciar corretamente o estado da interface, use um ViewModel. Jetpack Compose e ViewModels oferece uma análise mais detalhada desse fluxo de trabalho.

Além disso, use camadas de interface, que são uma parte essencial para criar interfaces com o Compose e permitem seguir as práticas recomendadas de arquitetura, como o fluxo de dados unidirecional. Para saber mais sobre camadas de UI, consulte a documentação da camada de UI.

Neste app de exemplo, a interface tem três estados básicos:

  • Carregando:mostra um círculo girando.
  • Conteúdo:mostra informações sobre seus passos de hoje.
  • Erro:mostra uma mensagem quando algo dá errado.

O ViewModel expõe esses estados como um Flow do Kotlin. Use uma classe sealed para conter as classes e os objetos que representam os possíveis estados:

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()
}

A interface do Compose coleta esse Flow como um State do Compose e age nele:

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