ヘルスコネクトを使ってみる

このガイドでは、アプリでヘルスコネクトの使用を開始する方法について説明します。

ステップ 1: ヘルスコネクト アプリを準備する

ヘルスコネクト アプリは、アプリがヘルスコネクト SDK を介して送信するすべてのリクエストを処理します。リクエストには、データの保存や読み取り / 書き込みアクセス権の管理などがあります。

ヘルスコネクトへのアクセスは、スマートフォンにインストールされている Android のバージョンによって異なります。以下のセクションでは、Android の最近のバージョンを処理する方法の概要を示します。

Android 14

Android 14(API レベル 34)以降、ヘルスコネクトは Android フレームワークの一部になっています。このバージョンのヘルスコネクトはフレームワーク モジュールです。そのため、セットアップは必要ありません。

Android 13 以前

Android 13(API レベル 33)以前のバージョンでは、ヘルスコネクトは Android フレームワークの一部ではありません。そのため、Google Play ストアからヘルスコネクト アプリをインストールする必要があります。

Android 13 以前のヘルスコネクトとアプリを統合していて、Android 14 に移行する場合は、Android 13 から Android 14 に移行するをご覧ください。

ヘルスコネクト アプリを開く

ヘルスコネクトは、デフォルトではホーム画面に表示されません。ヘルスコネクトを開くには、[設定] > [アプリ] > [ヘルスコネクト] に移動するか、[クイック設定] メニューにヘルスコネクトを追加します。

また、ヘルスコネクトでは、PIN、パターン、パスワードのいずれかによる画面ロックを有効にして、デバイスがロックされている間、ヘルスコネクト内に保存されているヘルスデータを悪意のある人々から保護する必要があります。画面ロックを設定するには、[設定] > [セキュリティ] > [画面ロック] に移動します。

ステップ 2: ヘルスコネクト SDK をアプリに追加する

ヘルスコネクト SDK は、Health Connect API を使用して、ヘルスコネクト アプリでデータストアに対してオペレーションを実行するときにリクエストを送信します。

ヘルスコネクト SDK の依存関係をモジュール レベルの build.gradle ファイルに追加します。

dependencies {
  ...
  implementation "androidx.health.connect:connect-client:1.1.0-alph10"
  ...
}

最新バージョンについては、ヘルスコネクトのリリース情報をご覧ください。

ステップ 3: アプリを構成する

以下のセクションでは、ヘルスコネクトと統合するようにアプリを構成する方法について説明します。

権限を宣言する

健康とフィットネスに関するデータへのアクセス権は機密情報です。ヘルスコネクトは、読み取りおよび書き込みオペレーションにセキュリティ レイヤを実装し、ユーザーの信頼を保ちます。

Google Play Console で、アプリが読み書きするヘルスコネクトのデータ型に対するアクセス権を宣言します。

アプリで、必要なデータ型に基づいて AndroidManifest.xml ファイルに読み取り権限と書き込み権限を宣言します。このデータ型は、Google Play Console でアクセス権を申告したものと一致している必要があります。

ヘルスコネクトは、標準の Android 権限の宣言形式を使用します。<uses-permission> タグを使用して権限を割り当てます。<manifest> タグ内でネストします。

<manifest>
  <uses-permission android:name="android.permission.health.READ_HEART_RATE"/>
  <uses-permission android:name="android.permission.health.WRITE_HEART_RATE"/>
  <uses-permission android:name="android.permission.health.READ_STEPS"/>
  <uses-permission android:name="android.permission.health.WRITE_STEPS"/>

  <application>
  ...
  </application>
</manifest>

権限とそれに対応するデータ型の一覧については、データ型のリストをご覧ください。

アプリのプライバシー ポリシーのダイアログを表示する

Android マニフェストには、アプリのプライバシー ポリシーを表示するアクティビティが必要です。プライバシー ポリシーとは、アプリがリクエストする権限の根拠であり、ユーザーデータの使用方法と処理方法を説明します。

このアクティビティを宣言し、ACTION_SHOW_PERMISSIONS_RATIONALE インテントを処理します。このインテントは、ユーザーがヘルスコネクトの権限画面でプライバシー ポリシーのリンクをクリックするとアプリに送信されます。

...
<application>
  ...
  <!-- For supported versions through Android 13, create an activity to show the rationale
       of Health Connect permissions once users click the privacy policy link. -->
  <activity
      android:name=".PermissionsRationaleActivity"
      android:exported="true">
    <intent-filter>
      <action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE" />
    </intent-filter>
  </activity>

  <!-- For versions starting Android 14, create an activity alias to show the rationale
       of Health Connect permissions once users click the privacy policy link. -->
  <activity-alias
      android:name="ViewPermissionUsageActivity"
      android:exported="true"
      android:targetActivity=".PermissionsRationaleActivity"
      android:permission="android.permission.START_VIEW_PERMISSION_USAGE">
    <intent-filter>
      <action android:name="android.intent.action.VIEW_PERMISSION_USAGE" />
      <category android:name="android.intent.category.HEALTH_PERMISSIONS" />
    </intent-filter>
  </activity-alias>
  ...
</application>
...

ヘルスコネクト クライアントを取得する

Health Connect API のエントリ ポイントは HealthConnectClient です。これにより、アプリはヘルスコネクト アプリでデータストアを使用できるようになります。基盤となるストレージ レイヤへの接続を自動的に管理し、すべての IPC を処理し、送信リクエストと受信レスポンスをシリアル化します。

クライアント インスタンスを取得するには、まず Android マニフェストでヘルスコネクト パッケージ名を宣言します。

<application> ... </application>
...
<!-- Check if Health Connect is installed -->
<queries>
    <package android:name="com.google.android.apps.healthdata" />
</queries>

次に、アクティビティで、getSdkStatus を使用してヘルスコネクトがインストールされているかどうかを確認します。インストールされている場合は、HealthConnectClient インスタンスを取得します。

val availabilityStatus = HealthConnectClient.getSdkStatus(context, providerPackageName)
if (availabilityStatus == HealthConnectClient.SDK_UNAVAILABLE) {
  return // early return as there is no viable integration
}
if (availabilityStatus == HealthConnectClient.SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED) {
  // Optionally redirect to package installer to find a provider, for example:
  val uriString = "market://details?id=$providerPackageName&url=healthconnect%3A%2F%2Fonboarding"
  context.startActivity(
    Intent(Intent.ACTION_VIEW).apply {
      setPackage("com.android.vending")
      data = Uri.parse(uriString)
      putExtra("overlay", true)
      putExtra("callerId", context.packageName)
    }
  )
  return
}
val healthConnectClient = HealthConnectClient.getOrCreate(context)
// Issue operations with healthConnectClient

ステップ 4: ユーザーに権限をリクエストする

クライアント インスタンスを作成した後、アプリはユーザーに権限をリクエストする必要があります。ユーザーがいつでも権限を付与または拒否できるようにする必要があります。

そのためには、必要なデータ型の権限セットを作成します。まず、セット内の権限が Android マニフェストで宣言されていることを確認します。

// Create a set of permissions for required data types
val PERMISSIONS =
setOf(
  HealthPermission.getReadPermission(HeartRateRecord::class),
  HealthPermission.getWritePermission(HeartRateRecord::class),
  HealthPermission.getReadPermission(StepsRecord::class),
  HealthPermission.getWritePermission(StepsRecord::class)
)

getGrantedPermissions を使用して、アプリが必要な権限をすでに持っているかどうかを確認します。持っていない場合は、createRequestPermissionResultContract を使用して権限をリクエストします。ヘルスコネクトの権限画面が表示されます。

// Create the permissions launcher
val requestPermissionActivityContract = PermissionController.createRequestPermissionResultContract()

val requestPermissions = registerForActivityResult(requestPermissionActivityContract) { granted ->
  if (granted.containsAll(PERMISSIONS)) {
    // Permissions successfully granted
  } else {
    // Lack of required permissions
  }
}

suspend fun checkPermissionsAndRun(healthConnectClient: HealthConnectClient) {
  val granted = healthConnectClient.permissionController.getGrantedPermissions()
  if (granted.containsAll(PERMISSIONS)) {
    // Permissions already granted; proceed with inserting or reading data
  } else {
    requestPermissions.launch(PERMISSIONS)
  }
}

ユーザーはいつでも権限を付与または取り消すことができるため、権限が一定であると想定しないでください。アプリは、許可されている権限を定期的に確認し、権限がなくなっている場合に対処できるようにする必要があります。

ステップ 5: オペレーションを実行する

すべての設定が完了したので、アプリで読み取りオペレーションと書き込みオペレーションを実行します。

データを書き込む

データをレコードに構造化します。ヘルスコネクトで利用可能なデータ型のリストを確認します。

val stepsRecord = StepsRecord(
    count = 120,
    startTime = START_TIME,
    endTime = END_TIME,
    startZoneOffset = START_ZONE_OFFSET,
    endZoneOffset = END_ZONE_OFFSET,
)

次に、insertRecords を使用してレコードを書き込みます。

suspend fun insertSteps(healthConnectClient: HealthConnectClient) {
    try {
        val stepsRecord = StepsRecord(
            count = 120,
            startTime = START_TIME,
            endTime = END_TIME,
            startZoneOffset = START_ZONE_OFFSET,
            endZoneOffset = END_ZONE_OFFSET,
        )
        healthConnectClient.insertRecords(listOf(stepsRecord))
    } catch (e: Exception) {
        // Run error handling here
    }
}

データを読み取る

readRecords を使用すると、データを個別に読み取ることができます。

suspend fun readStepsByTimeRange(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant
) {
    try {
        val response =
            healthConnectClient.readRecords(
                ReadRecordsRequest(
                    StepsRecord::class,
                    timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
                )
            )
        for (stepRecord in response.records) {
            // Process each step record
        }
    } catch (e: Exception) {
        // Run error handling here.
    }
}

また、aggregate を使用して、データを集計して読み取ることもできます。

suspend fun aggregateSteps(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant
) {
    try {
        val response = healthConnectClient.aggregate(
            AggregateRequest(
                metrics = setOf(StepsRecord.COUNT_TOTAL),
                timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
            )
        )
        // The result may be null if no data is available in the time range
        val stepCount = response[StepsRecord.COUNT_TOTAL]
    } catch (e: Exception) {
        // Run error handling here
    }
}

動画チュートリアル

ヘルスコネクトの機能と、スムーズな統合を実現するためのベスト プラクティスのガイドラインについては、次の動画をご覧ください。

リソース

今後の開発に役立つ以下のリソースをご覧ください。

  • ヘルスコネクト SDK(Jetpack で入手可能): Health Connect API を使用するには、アプリにこの SDK を組み込みます。
  • API リファレンス: Health Connect API については、Jetpack のリファレンスをご覧ください。
  • データ型の使用を申告する: Play Console で、アプリが読み取りと書き込みを行うヘルスコネクトのデータ型へのアクセスを申告します。
  • 任意の GitHub コードサンプルと Codelab: GitHub コードサンプル リポジトリCodelab の演習を参照して開始できます。

次のステップ

ヘルスコネクトで次のような操作を行う方法については、一般的なワークフローをご覧ください。