このガイドでは、基本的なモバイル歩数計アプリの作成手順について説明します。アプリには、 多くの健康およびビジネス ユーザーのフィットネス アプリ。
このワークフローには、次の API が統合されています。
- SensorManager: モバイル デバイスから歩数データを取得します。
- ローカル データ ストレージ用の Room。
- ヘルスコネクト: 健康やフィットネスに関するデータをデバイスに保存し、共有できます。
データの読み取りと必要なツールに関するその他のサポートについては、 モバイル デバイスから歩数を追跡する Android センサー マネージャー。
開発環境のセットアップがお済みでない場合、 ヘルスコネクトを使用する方法については、 スタートガイド できます。
ハンドヘルド デバイスで権限をリクエストする
エクササイズ データを取得する前に、適切な権限をリクエストして付与する必要があります。 付与できます。
必要な権限のみをリクエストし、 状況に応じて各権限をリクエストするのではなく、 権限を一度にすべて管理できます。
多くのエクササイズ アプリが使用する歩数計センサーは、
ACTIVITY_RECOGNITION
権限。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>
実行時に ACTIVITY_RECOGNITION
権限をリクエストするには、以下をご覧ください。
権限リクエストに関するドキュメントをご覧ください。
また、マニフェストで FOREGROUND_SERVICE
を宣言する必要もあります。あなたから
ACTIVITY_RECOGNITION
権限をリクエストしている場合、
FOREGROUND_SERVICE_TYPE_HEALTH
:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_HEALTH"/>
フォアグラウンド サービスにアクセスします。 をご覧ください。
ViewModel を使用して UI の状態を管理する
UI の状態を適切に管理するには、ViewModel を使用します。 詳しくは、Jetpack Compose と ViewModel をご覧ください。 説明します。
また、Compose で UI を構築するうえで重要な部分である UI レイヤリングも使用します。 次のようなアーキテクチャのベスト プラクティスを 単方向データフロー。UI のレイヤ化について詳しくは、このモジュールの UI レイヤのドキュメント
このサンプルアプリでは、UI に次の 3 つの基本的な状態があります。
- 読み込み中: 回転する円が表示されます。
- コンテンツ: 今日の歩数に関する情報を表示します。
- エラー: エラーが発生したときにメッセージが表示されます。
ViewModel
は、これらの状態を Kotlin Flow
として公開します。シールクラスを使用して、
考えられる状態を表すクラスとオブジェクトが含まれています。
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()
}
次に、Compose UI はこの Flow
を Compose State
として収集し、それを処理します。
val state: TodayScreenState = todayScreenViewModel.currentScreenState.collectAsState().value