Criar um app básico de condicionamento físico

Este guia orienta você na criação de um app de contagem 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 passos de um dispositivo móvel.
  • Room para armazenamento de dados locais
  • Conexão Saúde para armazenar e compartilhar dados de saúde e condicionamento físico no dispositivo.

Para mais suporte à leitura de dados e às ferramentas necessárias, consulte Usar o Gerenciador de sensores do Android para monitorar passos em um dispositivo móvel.

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

Solicitar permissões no dispositivo portátil

Antes de receber dados de exercícios, é necessário 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 fazer isso de uma só vez quando o usuário iniciar o app.

O sensor de contagem de passos, necessário para muitos apps de exercícios, usa a permissão ACTIVITY_RECOGNITION. Adicione essa permissão ao seu 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 durante a execução, consulte a documentação de solicitação.

Também é necessário 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 esse tipo de serviço.

Gerenciar o estado da interface usando um ViewModel

Para gerenciar corretamente o estado da interface, use um ViewModel. O Jetpack Compose e os ViewModels apresentam uma visão mais detalhada desse fluxo de trabalho.

Além disso, use as 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 as camadas da interface, consulte a documentação da camada da interface.

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

  • Carregando:mostra um círculo giratório.
  • 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 selada para conter as classes e os objetos que representam os estados possíveis:

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

Em seguida, a interface do Compose coleta essa Flow como uma State do Compose e age de acordo com ela:

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