1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ヘルスコネクトから歩数を取得したけど、なんだか合わないな…

Last updated at Posted at 2024-09-12

はじめに

この記事は、ヘルスコネクトから歩数を取得したけど、なんだか歩数の合計値が合わないな…ってなって、対処した時のメモです。

最初の実装

自分の場合は1日ごとの歩数の合計値を取得したくて AggregateGroupByPeriodRequest1 を使って下記のような実装をしていました。

// 1日ごとの歩数を集計する
// startTs, endTs ... Unix Time(ミリ秒)
AggregateGroupByPeriodRequest(
  metrics = setOf(StepsRecord.COUNT_TOTAL),
  // wrong
  timeRangeFilter = TimeRangeFilter.between(
    Instant.ofEpochMilli(startTs), 
    Instant.ofEpochMilli(endTs)
  ), 
  timeRangeSlicer = Period.ofDays(1),
  dataOriginFilter = setOf(DataOrigin("com.google.android.apps.fitness"))
)

その時、ヘルスコネクトで表示されている歩数とこのリクエストで得られる歩数に大きく差異あることがわかりました。

AggregateGroupByPeriodRequest の TimeRangeFilter2の実装箇所に問題がありました。期間を指定するのに日付けのタイムスタンプ(ミリ秒)を使っていたのでそのまま、Instant にして TimeRangeFilter に渡していたのですが、この場合だとUTCベースでの1日(-9時間なので日本時間の前日15:00:00-当日14:59:59)でSliceされてしまいます。

修正後

1日分の歩数を日本時間の00:00:00-23:59:59でsliceしたい場合はLocalDateTimeで渡してやる必要があります。

// 1日ごとの歩数を集計する
AggregateGroupByPeriodRequest(
  metrics = setOf(StepsRecord.COUNT_TOTAL),
  // correct
  timeRangeFilter = TimeRangeFilter.between(
    LocalDateTime.ofInstant(Instant.ofEpochMilli(startTs), ZoneOffset.ofHours(9)),
    LocalDateTime.ofInstant(Instant.ofEpochMilli(endTs), ZoneOffset.ofHours(9))
  ), 
  timeRangeSlicer = Period.ofDays(1),
  dataOriginFilter = setOf(DataOrigin("com.google.android.apps.fitness"))
)

まとめ

自分は原因追及と修正に丸1日かかってしまいました。取得データの startTime をチェックして初めて気がついた感じです。他の皆様のお役に立てれば幸いです。

  1. https://developer.android.com/reference/kotlin/androidx/health/connect/client/request/AggregateGroupByPeriodRequest

  2. https://developer.android.com/reference/androidx/health/connect/client/time/TimeRangeFilter

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?