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