はじめに
この記事は、ヘルスコネクトから歩数を取得したけど、なんだか歩数の合計値が合わないな…ってなって、対処した時のメモです。
最初の実装
自分の場合は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
をチェックして初めて気がついた感じです。他の皆様のお役に立てれば幸いです。