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