Menggabungkan data di Health Connect meliputi agregasi dasar atau menggabungkan data ke dalam bucket. Alur kerja berikut menunjukkan cara melakukan keduanya.
Agregasi dasar
Untuk menggunakan agregasi dasar pada data, gunakan fungsi aggregate
pada objek HealthConnectClient
. Fungsi ini menerima
objek AggregateRequest
tempat Anda menambahkan jenis metrik
dan rentang waktu sebagai parameternya. Cara penggabungan dasar dipanggil bergantung pada
jenis metrik yang digunakan.
Agregasi kumulatif
Agregasi kumulatif menghitung nilai total.
Contoh berikut menunjukkan cara menggabungkan data untuk suatu jenis data:
suspend fun aggregateDistance(
healthConnectClient: HealthConnectClient,
startTime: Instant,
endTime: Instant
) {
try {
val response = healthConnectClient.aggregate(
AggregateRequest(
metrics = setOf(DistanceRecord.DISTANCE_TOTAL),
timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
)
)
// The result may be null if no data is available in the time range
val distanceTotalInMeters = response[DistanceRecord.DISTANCE_TOTAL]?.inMeters ?: 0L
} catch (e: Exception) {
// Run error handling here
}
}
Agregasi statistik
Agregasi statistik menghitung nilai minimum, maksimum, atau rata-rata data dengan sampel.
Contoh berikut menunjukkan cara menggunakan agregasi statistik:
suspend fun aggregateHeartRate(
healthConnectClient: HealthConnectClient,
startTime: Instant,
endTime: Instant
) {
try {
val response =
healthConnectClient.aggregate(
AggregateRequest(
setOf(HeartRateRecord.BPM_MAX, HeartRateRecord.BPM_MIN),
timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
)
)
// The result may be null if no data is available in the time range
val minimumHeartRate = response[HeartRateRecord.BPM_MIN]
val maximumHeartRate = response[HeartRateRecord.BPM_MAX]
} catch (e: Exception) {
// Run error handling here
}
}
Bucket
Health Connect juga dapat Anda gunakan untuk menggabungkan data ke dalam bucket. Dua jenis bucket yang dapat Anda gunakan meliputi duration dan periode.
Setelah dipanggil, fungsi ini akan menampilkan daftar bucket. Perlu diperhatikan bahwa daftar ini bisa sparse sehingga bucket tidak disertakan dalam daftar jika tidak berisi data apa pun.
Durasi
Dalam hal ini, data gabungan dibagi menjadi beberapa bucket dalam jangka waktu tetap,
misalnya satu menit atau satu jam. Untuk menggabungkan data ke dalam bucket, gunakan
aggregateGroupByDuration
. Metode ini menerima
objek AggregateGroupByDurationRequest
tempat Anda menambahkan
jenis metrik, rentang waktu, dan Duration
sebagai parameter.
Berikut ini contoh langkah penggabungan ke dalam bucket berdurasi satu menit:
suspend fun aggregateStepsIntoMinutes(
healthConnectClient: HealthConnectClient,
startTime: LocalDateTime,
endTime: LocalDateTime
) {
try {
val response =
healthConnectClient.aggregateGroupByDuration(
AggregateGroupByDurationRequest(
metrics = setOf(StepsRecord.COUNT_TOTAL),
timeRangeFilter = TimeRangeFilter.between(startTime, endTime),
timeRangeSlicer = Duration.ofMinutes(1L)
)
)
for (durationResult in response) {
// The result may be null if no data is available in the time range
val totalSteps = durationResult.result[StepsRecord.COUNT_TOTAL]
}
} catch (e: Exception) {
// Run error handling here
}
}
Periode
Dalam hal ini, data gabungan dibagi menjadi beberapa bucket dalam rentang waktu berbasis tanggal,
misalnya satu minggu atau satu bulan. Untuk menggabungkan data ke dalam bucket, gunakan
aggregateGroupByPeriod
. Metode ini menerima objek AggregateGroupByPeriodRequest
tempat Anda menambahkan
jenis metrik, rentang waktu, dan Period
sebagai parameter.
Berikut ini contoh langkah penggabungan ke dalam bucket bulanan:
suspend fun aggregateStepsIntoMonths(
healthConnectClient: HealthConnectClient,
startTime: LocalDateTime,
endTime: LocalDateTime
) {
try {
val response =
healthConnectClient.aggregateGroupByPeriod(
AggregateGroupByPeriodRequest(
metrics = setOf(StepsRecord.COUNT_TOTAL),
timeRangeFilter = TimeRangeFilter.between(startTime, endTime),
timeRangeSlicer = Period.ofMonths(1)
)
)
for (monthlyResult in response) {
// The result may be null if no data is available in the time range
val totalSteps = monthlyResult.result[StepsRecord.COUNT_TOTAL]
}
} catch (e: Exception) {
// Run error handling here
}
}
Batasan baca
Secara default, aplikasi Anda dapat membaca data hingga 30 hari dengan izin apa pun yang diberikan.
Dengan izin PERMISSION_READ_HEALTH_DATA_HISTORY
, aplikasi
Anda dapat membaca data yang lebih lama dari 30 hari.
Batasan 30 hari
Aplikasi dapat membaca data dari Health Connect hingga 30 hari sebelum izin apa pun pertama kali diberikan.
Namun, jika pengguna menghapus aplikasi Anda, histori izin akan hilang. Jika pengguna menginstal ulang aplikasi Anda dan memberikan izin lagi, aplikasi Anda dapat membaca data dari Health Connect hingga 30 hari sebelum tanggal baru tersebut.
Contoh 30 hari
Jika pengguna pertama kali memberikan izin baca ke aplikasi Anda pada 30 Maret 2023, data paling awal yang dapat dibaca kembali oleh aplikasi Anda akan berasal dari 28 Februari 2023 dan seterusnya.
Kemudian, pengguna tersebut menghapus aplikasi Anda pada 10 Mei 2023. Pengguna tersebut memutuskan untuk menginstal ulang pada 15 Mei 2023 dan memberikan izin baca. Tanggal awal data yang dapat dibaca aplikasi Anda sekarang adalah dari tanggal 15 April 2023.
Membaca data yang lebih lama dari 30 hari
Jika ingin membaca data yang lebih lama dari 30 hari, Anda harus menggunakan izin PERMISSION_READ_HEALTH_DATA_HISTORY
. Tanpa izin ini,
upaya untuk membaca satu data yang lebih lama dari 30 hari akan menyebabkan error.
Anda juga tidak dapat membaca data yang lebih lama dari 30 hari menggunakan salah satu permintaan rentang waktu.