基本的なフィットネス アプリを作成する

このガイドでは、基本的なモバイル歩数計アプリの作成手順について説明します。アプリには、 多くの健康およびビジネス ユーザーのフィットネス アプリ。

このワークフローには、次の 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