ヘルスコネクトでデータ読み取り書き込み!やさしいはじめの一歩

※本ページにはプロモーション(広告)が含まれています。
ヘルスコネクトでデータ読み取り書き込み!やさしいはじめの一歩

ヘルスコネクトで歩数データの読み取りはできても、いざ睡眠情報の書き込みが動かず手が止まってしまうことはありませんか?

この記事では、導入設定からAPIの許可取得、サンプルコードで歩数や睡眠を往復させるまでを順序通りに示し、初めてでも端末上で数分以内にデータの往来を確認できるようになります。さらに実装後の同期自動化やトラブル回避のコツも合わせて得られます。

今すぐ手元のプロジェクトで操作を試し、動く画面を見ながら理解を深めてください。ステップをなぞるうちに、日々の開発へそのまま応用できる自信が自然と芽生えます。

目次

ヘルスコネクトの読み取り書き込みがひらく世界

ヘルスコネクトの読み取り書き込みがひらく世界

Health Connectを導入すると、歩数や心拍などのデータをアプリ間でやりとりできるようになります。ユーザーの健康情報を一元管理できるため、フィットネスアプリやダイエットアプリのパワーがグッと上がります。

Android 14以降と最新のHealth Connect APIを前提に、読み取りと書き込みを行うためのポイントをまとめました。これを押さえれば自信を持って実装に進めます。

  1. 初期セットアップ:モジュールの依存関係を追加してHealthConnectClientを準備する
  2. 権限の確認とリクエスト:アプリがアクセスできるデータ型をダイアログで許可してもらう
  3. データの読み取り:HealthConnectClientから歩数や睡眠データをクエリして取得する
  4. データの書き込み:ユーザーの体重やワークアウト詳細をHealth Connectに保存する
  5. 動作確認:実機やエミュレータで読み書きが正しく動くかチェックする

エンジニアの視点では、必要な権限だけをリクエストしてユーザーのプライバシーを守ることが大切です。例外処理を丁寧に入れて、読み取りや書き込みに失敗したときのユーザーフィードバックも忘れずに組み込みましょう。

実体験に基づく手順ヘルスコネクトをセットアップして読み取り書き込みを試す

実体験に基づく手順ヘルスコネクトをセットアップして読み取り書き込みを試す

Health Connectを使うには、まずライブラリの導入から権限の取得、実際の読み書きテストまで順番に進めていきます。実際に手を動かしてわかったポイントを交えながら、最短ルートで動くサンプルまで案内します。

  1. ライブラリ導入:アプリのbuild.gradleにHealth Connectの依存を追加
  2. パーミッション設定:AndroidManifest.xmlと実行時リクエストで必要な権限を用意
  3. クライアント初期化:HealthConnectClientを生成して接続準備
  4. データ読み書き:歩数などのヘルスデータを読み取り/書き込みするサンプルを実装
  5. 動作確認:実機やエミュレータで正常にデータがやり取りできるかチェック

注意点:実機でテストする際はHealth Connectアプリがインストールされているか確認してください。

Android 14とHealth Connect API v1.1.0で動作確認済みです。

AndroidStudioでプロジェクトを用意する

AndroidStudioでプロジェクトを用意する

Android Studioを起動すると、新しいプロジェクトを手軽に作成できるウィザードが表示されます。この流れに沿ってアプリ名やパッケージ名を入力するだけで、必要なフォルダ構成やGradle設定が自動で用意されます。

テンプレートとして「Empty Activity」を選べば、画面表示用のレイアウトファイルやActivityの雛形がそろった状態でスタートできます。レイアウトプレビューやエミュレータ連携もすぐに使えるので、ヘルスコネクトの読み書きを実装しながら動作確認がスムーズに進みます。

①AndroidStudioを開き新規プロジェクトを作成する

手順
AndroidStudioを起動する

WindowsならスタートメニューからAndroidStudioを選択。Macならアプリケーションフォルダから起動します。

手順
新規プロジェクトを作成する

「Start a new Android Studio project」をクリックし、「Empty Activity」を選びます。アプリ名やパッケージ名を入力し、「Finish」を押してプロジェクトを作成します。

②build.gradleでHealthConnectライブラリを追加する

手順
build.gradleにHealth Connectライブラリを追加

プロジェクトのモジュールレベルbuild.gradleを開きます。

repositoriesブロックに以下を追加して、Health ConnectのMavenリポジトリを有効化します。

maven { url "https://androidx.dev/health" }

続いてdependenciesブロックにHealth Connectクライアントを追加します。

implementation "androidx.health:health-connect-client:最新バージョン"

書き加えたらSync Nowをクリックして同期が成功するか確認しましょう。

もし同期エラーが出たらキャッシュクリア後に再度同期するとスムーズです。

③端末設定からHealthConnectを有効にする

手順
設定アプリを開く

ホーム画面またはアプリ一覧から歯車アイコンの設定アプリをタップしてください。

手順
プライバシーとセキュリティを選ぶ

設定画面をスクロールして「プライバシーとセキュリティ」を探し、タップしてください。

手順
Health Connectを有効にする

リストから「Health Connect」を見つけてスイッチをタップしてください。許可の確認が出たら「許可」を選んで完了です。

④アプリに読み取り権限をリクエストする

手順
HealthConnectClientを準備する

まずはHealthConnectClientをアクティビティやフラグメントで取得します。

val healthClient = HealthConnectClient.getOrCreate(applicationContext)

手順
読み取り権限のセットを作る

ステップ数データを読むための権限セットを用意します。

val permission = HealthPermission.createReadPermission(Records.StepsRecord::class)

val permissions = setOf(permission)

手順
権限リクエストを実行する

ユーザーにポップアップで権限を許可してもらいます。

healthClient.permissionController.requestPermissions(this, permissions)

ユーザーが権限を拒否した場合に備えて、権限が取れなかったときの画面やメッセージを用意しておくと親切です。

補足:healthClient.permissionController.getGrantedPermissions()で、リクエスト前にすでに許可済みか確認できます。

⑤サンプルデータを書き込んでみる

サンプルデータを書き込むには、まず書き込み権限を取得した状態でHealthConnectClient.insertRecordsを呼び出してください。ここでは歩数データを例に、10分間の間に1000歩を記録するサンプルを試してみます。

val sampleRecord = StepsRecord(
    startTime = ZonedDateTime.now().minusMinutes(10).toInstant().toEpochMilli(),
    endTime = ZonedDateTime.now().toInstant().toEpochMilli(),
    count = 1000
)
val request = RecordsRequest(listOf(sampleRecord))
val response = healthConnectClient.insertRecords(request)
Log.d("HealthConnect","Inserted records: ${response.insertedRecordIds}")

RecordsRequestには複数のレコードをまとめて渡せるので、サンプル以外のデータを同時に送信したいときも便利です。レスポンスから返されるIDをログ出力すると、実際に書き込まれたことが確認できます。

注意点:書き込み時には対象のDataTypeへの書き込み権限が必須です。権限が不足しているとSecurityExceptionが発生するので、事前にcatchしておくか権限リクエストを確認してください。

補足:他のデータタイプを試す場合も、StepsRecord→BloodPressureRecordなどに変えるだけで同じ流れで書き込めます。

⑥書き込んだデータを読み取ってログに表示する

手順
書き込んだデータを読み取ってログに表示する

まず、読み取り用のリクエストを作ります。必要なフィールドや時間範囲を指定することで、意図したデータだけを取得できます。

val readRequest = ReadRecordsRequest(
    recordType = StepsRecord::class,
    timeRangeFilter = TimeRangeFilter.between(
        startTime = ZonedDateTime.now().minusDays(1),
        endTime = ZonedDateTime.now()
    )
)

次にHealthConnectクライアントを使ってリクエストを実行し、結果をログに出力します。実行はバックグラウンドで行うとUIが固まりません。

lifecycleScope.launch {
    val response = healthConnectClient.readRecords(readRequest)
    response.records.forEach { record ->
        val steps = record.getLongValue(HealthFields.STEPS.delta)
        Log.d("HealthConnectSample", "取得した歩数:\$steps")
    }
}

公式サンプルアプリで読み取り書き込みを体験する

公式サンプルアプリで読み取り書き込みを体験する

公式サンプルアプリをAndroidStudioで起動するだけでヘルスコネクトの読み取りや書き込みをすぐに体験できます。動くコードを手元で確認しながらUIで結果が見られるので権限まわりも含めて流れをつかみやすいです。

  1. 面倒な初期設定なしでサンプル動作を確かめられる
  2. サンプルコードを読みながら仕組みが自然に理解できる
  3. UI上でデータの読み取りや書き込みが手軽に試せる
  4. 動作確認後は自分のアプリへ流用しやすい土台になる

①GitHubからサンプルをダウンロードする

ここからはローカルにサンプルを用意するやさしい一歩です。GitHubで公開されているリポジトリをクローンして、あとでプロジェクトを開けるようにしましょう。

手順
サンプルリポジトリをクローン

まずブラウザでサンプルのGitHubページを開き、緑色の「Code」ボタンをクリックしてURLをコピーします。

つぎにターミナルを立ち上げて、作業したいフォルダに移動します。

git clone https://github.com/ユーザ名/サンプルリポジトリ.git

このコマンドで最新のサンプル一式がローカルにダウンロードされます。

②AndroidStudioでインポートする

手順
Import Module を開く

メニューバーから File → New → Import Module を選んでモジュール追加画面を開きます。

手順
モジュールのパスを指定

プロジェクト内の health-connect-sdk またはサンプルフォルダを参照してルートディレクトリを選びます。

手順
モジュール名を確認して追加

表示されるモジュール名が想定どおりかチェックし、OKを押して読み込みを開始します。

手順
Gradle同期を実行

追加後に画面右上の Sync アイコンをクリックしてプロジェクトを同期します。

Android Studioのバージョンによっては Import Module が New Module → Import Gradle Project に統合されている場合があります。

モジュール名は後で settings.gradle.kts で編集できるので、迷ったらデフォルトのまま進めても問題ありません。

③Runボタンで端末にインストールする

手順
Runボタンをクリック

Android Studioの上部ツールバーにあるアイコンを押します。

手順
デバイスを選ぶ

表示されたダイアログから接続済みの実機やエミュレータを選択します。

手順
インストールと起動を待つ

バックグラウンドでアプリが端末に送られ、自動で起動します。

実機でテストするときは開発者オプションとUSBデバッグが有効になっているかチェック。

端末によってはインストール許可ダイアログが出るので、画面を見逃さないようにしましょう。

④アプリ内のボタンで書き込みを実行する

手順
レイアウトに書き込みボタンを追加する

アプリ画面で書き込みを実行するボタンを用意します。res/layout/activity_main.xml

手順
クリックイベントでHealthConnectへの書き込みを呼び出す

MainActivityのonCreate内でボタンを取得し、クリック時に記録登録メソッドを呼びます。ライフサイクルスコープを使って例外をキャッチするとクラッシュを防げます。

val writeButton = findViewById

⑤リスト画面で読み取ったデータを確認する

手順
リスト画面で読み取ったデータを確認する

ヘルスコネクトから取得した歩数や心拍数のデータがリスト表示に並んでいるかを見てみましょう。日付やタグで絞り込みを設定すると、特定のデータだけをチェックしやすくなります。

Adapterで表示件数を制限している場合は、実際のデータ件数と合っているかを必ず確認しましょう。

ヘルスコネクトの読み取り書き込みを活かしたプチ応用アイデア

ヘルスコネクトの読み取り書き込みを活かしたプチ応用アイデア

スマホアプリでヘルスコネクトのデータを自由に読み書きできるようになると、ちょっとした工夫で毎日の健康管理をもっと楽しくできるようになります。ここでは経験を踏まえたプチ応用アイデアをご紹介します。

応用アイデア役立つ場面や効果
スマートアラーム睡眠の深さデータをもとに目覚めやすいタイミングで通知してくれるので、すっきり目覚めたい朝に最適です。
アクティブ壁紙歩数や移動距離の増減に合わせて壁紙が変化するから、自然と運動ペースが上がりやすくなります。
週次グラフ共有心拍や活動量を自動でグラフ化し、SNSにシェアできるからモチベーションアップにつながります。

自作歩数計アプリとGoogleFitを双方向同期する

自作歩数計アプリとGoogleFitを双方向同期する

自作歩数計アプリをGoogleFitと仲良くつなげると、スマホやウェアラブルなどで記録した歩数データが自動で行き来します。たとえばアプリで記録したデータをGoogleFitアプリで見られるようになったり、GoogleFitに溜まったデータを自作アプリ側へ読み込んだりできます。

この双方向同期のしくみはGoogleFitのHistory API(過去データのやり取り)とSubscription API(リアルタイム更新の受信)を組み合わせることで実現します。History APIで書き込みと読み取りを管理しつつ、Subscription APIで新しいセッションが始まったら自動更新を受け取る流れです。

こんな場面でおすすめです。まず自作アプリのデザインにこだわりたいとき。GoogleFitのグラフと自作アプリのUIを両方活かして歩数を可視化できます。つぎにデータをクラウドにバックアップしたいとき。GoogleFitが自動でバックアップしてくれるので、万が一スマホを乗り換えても安心です。

実装のポイントは、起動時と定期的にGoogleFitへの認証をチェックし、許可が得られていればHistory APIでデータを書き込み・読み込み、Subscription APIで歩数イベントを受け取ることです。これで自作アプリとGoogleFitの間をシームレスにデータが行き来して、ユーザー体験がぐっと広がります。

WorkManagerで定期同期ジョブを設定する

WorkManagerならOS再起動やアプリ停止にも負けずに定期処理を呼び出せます。ここでは例として15分おきにバックグラウンドでデータ同期を走らせる方法をやさしく解説します。

手順
WorkManager依存を追加

モジュールの build.gradle に依存を足します。これでWorkManager APIが使えるようになります。

dependencies {
    implementation "androidx.work:work-runtime-ktx:2.8.1"
}
手順
Workerクラスを用意

同期処理を行う Worker を継承したクラスを作ります。doWork() 内でAPI呼び出しやデータベース更新を行ってください。

public class SyncWorker extends Worker {
    public SyncWorker(@NonNull Context ctx,@NonNull WorkerParameters params){
        super(ctx,params);
    }
    @NonNull
    @Override
    public Result doWork(){
        // データ同期の処理
        return Result.success();
    }
}
手順
PeriodicWorkRequestを登録

PeriodicWorkRequest を作成して WorkManager に登録します。初回起動から15分ごとに繰り返されます。

PeriodicWorkRequest syncRequest=
    new PeriodicWorkRequest.Builder(
        SyncWorker.class,
        15,TimeUnit.MINUTES)
    .build();
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
    "dataSync",
    ExistingPeriodicWorkPolicy.KEEP,
    syncRequest);

最短でも15分が周期の下限です。1分や5分で動かしたい場合はAlarmManagerと併用が必要になることがあります。

端末の省電力モード中でもWorkManagerは自動で最適化してくれるので、Dozeモード対策も心配いりません。

HealthConnectから歩数を取得してRoomに保存する

手順
Health Connectへのアクセス権をリクエストする

アプリ起動時にHealthConnectClientを取得して、歩数データの読み取り権限を求めます。

val healthConnectClient = HealthConnectClient.getOrCreate(context)
val request = PermissionsRequest(
  listOf(readRecordsPermission(StepsRecord::class)),
  emptySet()
)
healthConnectClient.requestPermissions(request)
手順
歩数データを読み取る

権限が許可されたら、Health Connectから指定期間の歩数を取得します。

val response = healthConnectClient.readRecords(
  ReadRecordsRequest(
    recordType = StepsRecord::class,
    timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
  )
)
val stepRecords = response.records
手順
Roomに保存する

取得した歩数レコードをアプリのRoomエンティティに変換し、DAO経由でデータベースに挿入します。

val entities = stepRecords.map { record ->
  StepEntity(
    timestamp = record.startTime.millis,
    count = record.steps
  )
}
stepDao.insertAll(entities)

ローカルデータをHealthConnectへ書き戻す

手順
HealthConnectClientを作成する

HealthConnectとやり取りするため、アプリのContextを渡してクライアントを準備します。

val client = HealthConnectClient.create(context)

このclientを使ってデータの読み書きを行います。

手順
ローカルデータをレコードに変換して書き戻す

アプリ内のデータをHealthConnect用のRecordに変換し、一括で登録します。

val records = localDataList.map { it.toHealthRecord() }

val response = client.insertRecords(
  RecordNamespace.HEALTH_SERVICES,
  records
)

レスポンスのsuccessfulRecordsやfailedRecordsを確認すると、登録結果がわかります。

睡眠トラッカーのCSVデータを一括移行する

睡眠トラッカーのCSVデータを一括移行する

たくさんの過去データをコツコツ入力するのは大変ですよね。Health Connectを使えば、睡眠トラッカーから書き出したCSVファイルをまとめて読み込めるようになります。

この方法なら、手動で時間を登録する手間がほとんどなくなり、これまでの睡眠パターンをそのまま新しいアプリに引き継げます。

CSV一括移行のポイント
  • 時間節約:数百件のデータもワンクリックで登録できる
  • データ整合性アップ :手入力ミスをグッと減らせる
  • 履歴そのまま移行:過去の睡眠傾向を簡単に振り返れる

次のステップでは、CSVをHealth Connectへ取り込む具体的な手順を紹介します。準備が整ったらさくっと進めてみましょう。

CSVをパースしてSleepSessionオブジェクトを生成する

CSVファイルはassetsフォルダに配置し、assets.openで取得します。BufferedReaderで1行ずつ読み込み、drop(1)でヘッダーを飛ばしてからsplit(",")で項目を分割します。

val inputStream = context.assets.open("sleep_data.csv")
val sessions = inputStream.bufferedReader().useLines { lines ->
    lines.drop(1).mapNotNull { line ->
        val cols = line.split(",")
        val startTime = cols.getOrNull(0)?.toLongOrNull()
        val endTime = cols.getOrNull(1)?.toLongOrNull()
        if (startTime != null && endTime != null) {
            SleepSession.Builder()
                .setStartTime(startTime, TimeUnit.MILLISECONDS)
                .setEndTime(endTime, TimeUnit.MILLISECONDS)
                .build()
        } else null
    }.toList()
}

これでCSVの各行からSleepSessionオブジェクトが生成され、Health Connectへの登録準備が整います。

HealthConnectにセッションを書き込む

手順
HealthConnectにセッションを書き込む

まずはセッション内容をまとめたSessionRecordを作成します。開始・終了のタイムスタンプやアクティビティタイプを指定してください。

val sessionRecord = SessionRecord.Builder( "自作セッションID", HealthConnectClient.Metadata.Builder() .setName("ランニング") .build(), Instant.ofEpochMilli(startTime), Instant.ofEpochMilli(endTime) ).build()

次に作成したセッションをsessionClient.insertSessionで書き込みます。成功・失敗のコールバックでログを残すと後から確認しやすいです。

sessionClient.insertSession(sessionRecord) .addOnSuccessListener { // セッション保存成功 } .addOnFailureListener { e -> // 保存失敗時は例外内容をログ出力 }

補足:同じセッションIDで再度書き込むと上書きされます。別のセッションを保持したい場合はユニークなIDを使いましょう。

書き込み後にアプリ内で睡眠グラフを描画する

手順
Health Connectから睡眠データを取得

書き込み完了後にHealth ConnectのreadSessionを呼び出して、指定期間の睡眠セッションを手に入れます。

例:val sessions = healthConnectClient.readSession( … sleepTypeSets … )

手順
セッションデータをグラフ用に整形

取得したセッションから開始時間と終了時間をEpochミリ秒に変換し、リスト構造にします。

例:dataList.add(Entry(startTime.toFloat(), durationHours.toFloat()))

手順
MPAndroidChartで睡眠グラフを描画

整形したデータをLineDataSetに渡し、LineChartにセットすると曲線グラフが表示されます。

例:chart.data = LineData(LineDataSet(dataList, "睡眠時間"))

実際に試したところ、UIスレッドをふさがないようデータ整形はDispatchers.IOで行うとサクサク動きます。

バックグラウンドサービスで自動同期を走らせる

バックグラウンドサービスで自動同期を走らせる

バックグラウンドサービスを使うと、アプリを閉じていても定期的にHealth Connectのデータを読み書きできるようになります。WorkManagerを活用すれば、Android 13以降の省電力モードにも対応しながら同期処理を安心して任せることができます。

  1. 安定したスケジューリング:OSの制限下でも約束どおり同期タスクが動作
  2. 自動再試行:ネットワーク切断や例外発生後にも再度チャレンジ
  3. 実行条件の設定:充電中だけ/Wi-Fi接続時だけなど好みで調整可能

WorkManagerならコードもシンプルで、コルーチン対応のWorkerを実装してHealth Connectクライアントを呼び出すだけです。サービス寿命の管理やバッテリー最適化への対応を気にせずに済むので、とくにバックグラウンド同期を確実に行いたいときにおすすめです。

WorkManagerはAndroid OSに合わせてタスクを先延ばしにする場合があるので、ミリ秒単位の頻度が必要なときはForeground Serviceの検討も必要です。

補足:バッテリー最適化を無効化するとWorkManagerのタスクがすぐ動くようになりますが、ユーザーの体験を損ねないよう注意してください。

ForegroundServiceで長時間タスクを実装する

手順
マニフェストでサービス宣言と権限追加

AndroidManifest.xmlにForegroundService用のパーミッションとService登録を追加します。

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

<application>
  <service
    android:name=".MyForegroundService"
    android:foregroundServiceType="none"/>
</application>
手順
通知チャンネルと通知を用意

Android 8.0以上は通知チャンネルが必須です。Service起動前にチャンネルを登録してください。

val channel = NotificationChannel(
  "sync_channel",
  "SyncChannel",
  NotificationManager.IMPORTANCE_LOW
)
notificationManager.createNotificationChannel(channel)

val notification = NotificationCompat.Builder(this, "sync_channel")
  .setContentTitle("同期中")
  .setSmallIcon(R.drawable.ic_sync)
  .build()
手順
startForegroundでタスク開始

onStartCommand内でstartForegroundを呼びタスクを開始します。重い処理はCoroutineやスレッドで動かすと画面が固まりません。

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
  startForeground(1, notification)
  lifecycleScope.launch(Dispatchers.IO) {
    // 長時間処理
    syncData()
    stopForeground(true)
    stopSelf()
  }
  return START_STICKY
}
手順
完了後のクリーンアップ

処理が終わったらstopForegroundとstopSelfを確実に呼びバックグラウンドから解放します。

BatteryOptimizationsを回避する設定を行う

手順
BatteryOptimizationsを回避する設定を行う

まずAndroidManifest.xmlに無視許可の記述を加えます。

android:usesPermission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"を追加してください。

アプリ起動時か必要なタイミングで、無視設定を促すIntentを作成します。

val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply { data = Uri.parse("package:$packageName") }

作成したIntentをstartActivity(intent)で呼び出してください。

実際にはユーザーが拒否するケースもあるので、無視設定が適用されたかどうかをPowerManager.isIgnoringBatteryOptimizations(packageName)で必ず確認しましょう。

無視設定が既に有効かをチェックすると、ユーザー体験を損なわずに済みます。

現場での経験上、この確認を省くと何度もダイアログが表示されてクレームにつながりました。

同期結果を通知チャンネルで知らせる

手順
通知チャンネルを作成する

通知チャンネルは Android8以上で必須なので、初回起動時やチャンネル未作成時にだけ登録すると無駄がありません。

NotificationManager manager = getSystemService(NotificationManager.class);
if (manager.getNotificationChannel("sync_channel") == null) {
    NotificationChannel channel = new NotificationChannel(
        "sync_channel",
        "同期結果通知",
        NotificationManager.IMPORTANCE_DEFAULT
    );
    channel.setDescription("データ同期の成功/失敗をお知らせします");
    manager.createNotificationChannel(channel);
}
手順
同期完了時に通知を送る

同期処理が終わったタイミングで NotificationCompat.Builder を使い、先ほどのチャンネルで通知を発行します。

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "sync_channel")
    .setSmallIcon(R.drawable.ic_sync)
    .setContentTitle("データ同期完了")
    .setContentText("最新の健康データが読み込まれました")
    .setAutoCancel(true);

NotificationManagerCompat.from(this).notify(1001, builder.build());

通知チャンネルは一度作成すると変更が反映されないので、名前や重要度を変えたいときはアプリをアンインストールするか別IDで登録してください。

補足: 通知アイコンは透明部分を活かすテーマカラーに合わせるとマテリアルデザインに馴染みます。

よくある質問

よくある質問

Health Connectアプリが端末にないと言われます

Health Connectアプリが端末にないと言われます

最新のAndroid 12以上ではHealth Connectが別アプリとして提供されています。Playストアで「Health Connect」をインストールしてから再度権限をリクエストしてみてください。それでも認識しないときは、端末設定>アプリ一覧からHealth Connectを手動で有効化するとスムーズです。

権限を許可したのにデータが取得できません

権限を許可したのにデータが取得できません

Health Connectは権限リクエスト後すぐに反映しない場合があります。実体験だと、リクエスト→アプリ再起動で読み取りOKになりました。また、サンプルデータがまだ存在しないケースもあるので、まずは寝る前にステップで書き込んだ歩数を翌朝チェックしてみると安心です。

書き込んだ心拍数データが見当たりません

書き込んだ心拍数データが見当たりません

実験で、同じタイムスタンプやデータIDで重複登録しようとすると古いデータが上書きされたことがありました。書き込み時に一意のIDを設定すると複数データを保存できます。それでも見えない場合は、読み込みクエリの時間範囲を広げて再度チェックしてください。

ヘルスコネクトの読み取りと書き込みは無料なの?

ヘルスコネクトの読み取りも書き込みも、APIとしては追加料金なく使えます。Android Jetpackの一部として提供されているので、ライセンス費用や利用料を気にせずに実装できます。

ただし、ヘルスコネクトをサポートしていない端末やOSバージョンでは動作しないので、実機での動作確認を忘れずに行ってください。ユーザーから必要な権限をもらうことさえクリアすれば、全機能を無料で活用できます。

権限ダイアログが何度も出てくるのはどうして?

Androidでは権限をリクエストするたびダイアログが表示されます。読み取りと書き込みなど別々の権限を個別に求めると、その都度ポップアップが出る仕組みです。

まとめて複数の権限を聞けるActivityResultLauncherrequestMultiplePermissionsを活用すると一度の操作で許可を集められます。またshouldShowRequestPermissionRationaleで再表示のタイミングを制御すると何度もダイアログが出るのを抑えられます。

古いAndroidバージョンでも動く?

Health ConnectはAndroid 12で登場したけれど、Jetpack Health ConnectライブラリのおかげでAndroid 9以降なら同じAPIを呼び出せるようになっているよ。

公式のライブラリを入れておくとOSバージョンの違いを意識しなくていいから、余計な分岐が減ってコードがスッキリするのがうれしいポイントだよ。

どうしてもAndroid 8以前をカバーしたいときは、Health Connectを使わずにGoogle Fitや各社SDKを直接たたく方法があるけれど、メンテナンス性を考えるとAndroid 9以上を対象にするのがおすすめだよ。

テストで入れたデータを消したいときは?

テストで追加したヘルスデータは、HealthConnectClientのdeleteRecordsメソッドでまとめて消せます。

手順
HealthConnectClientの取得

まずはHealthConnectClientを用意します。最新のAndroid14を前提に書いています。

val healthConnectClient = HealthConnectClient.getOrCreate(context)
手順
削除リクエストを作成

テスト用に入れたStepsRecord(歩数データ)を例に、時間範囲を指定して削除リクエストを組み立てます。

val request = DeleteRecordsRequest(
  recordType = StepsRecord::class,
  timeRangeFilter = TimeRangeFilter.between(
    startTime = LocalDateTime.of(2023,1,1,0,0).toInstant(ZoneOffset.UTC),
    endTime = LocalDateTime.now().toInstant(ZoneOffset.UTC),
  )
)
手順
リクエスト送信&確認

deleteRecordsを呼び出して、削除結果をログなどで確認しましょう。

val response = healthConnectClient.deleteRecords(request)
// 削除件数をチェック
Log.d("HealthConnect","Deleted ${response.deletedRecordsCount} records")

時間範囲フィルターを広くしすぎると意図しないデータまで消えるので注意してください。

もしテストデータをすべて消したい場合は、TimeRangeFilterではなくDeleteAllRecordsRequestを検討すると便利です。

GoogleFitと何が違うの?

GoogleFitはGoogleが作った健康データの管理サービスで、主にGoogleのアプリやそれに対応したフィットネスアプリ同士でデータをやり取りします。Health ConnectはAndroid全体で健康・フィットネス情報をアプリ間で安全に共有できる仕組みを提供していて、さまざまな開発者やメーカーのアプリが参加しやすい仕組みです。

項目Google FitHealth Connect
対応データ種類歩数・心拍数・ワークアウトなどGoogle定義の項目歩数・心拍数はもちろん睡眠・体重・栄養など幅広く対応
データ共有範囲同じGoogleアカウント内の対応アプリ間Android端末内の任意のアプリ同士
権限モデルGoogleアカウント連携とアプリごとの設定Android設定画面からデータカテゴリ単位で許可
エコシステムGoogleエコシステム中心の連携Google以外も含む多彩なアプリで連携可能
主な用途Googleサービス間での統合的な記録様々なアプリ同士でデータを利活用

Health Connectはデータ取り扱いをAndroidのコア機能としてまとめてくれているので、一度許可を与えれば以降は新しいアプリを入れてもすぐに連携できます。実体験だと、睡眠アプリとワークアウトアプリを同時に使っても、データの二重記録や不足がなく安心でした。

補足:最新のAndroid 14以降であればHealth Connectの設定画面が統合されているので、権限まわりがさらに分かりやすくなっています。

まとめ

まとめ

Health Connectを有効にしてライブラリを追加しパーミッションを通せば手軽に健康データを読み書きできるようになりました。

  1. 準備編:build.gradleに依存関係を追加して必要な権限をManifestに記載。
  2. 読み書き編:HealthConnectClientでreadRecords/sendRecordsを実装してサンプルデータを操作。
  3. 応用編:フィルタや時間指定クエリで欲しいデータだけ効率的に取得。

ここまでの流れをマスターすれば心拍や睡眠ログへの展開がスムーズになります。ぜひ実際にコードを動かして新しいデータ連携にチャレンジしてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次