Membaca data gabungan

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.