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
    }
}

Memfilter menurut asal data

Anda juga dapat memfilter data gabungan menurut asalnya. Misalnya, hanya menyertakan data yang ditulis oleh aplikasi tertentu.

Contoh berikut menunjukkan cara menggunakan dataOriginFilter dan AggregateRequest untuk menggabungkan langkah-langkah dari aplikasi tertentu:

suspend fun aggregateStepsFromSpecificApp(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant,
    appPackageName: String
) {
    try {
        val response = healthConnectClient.aggregate(
            AggregateRequest(
                metrics = setOf(StepsRecord.COUNT_TOTAL),
                timeRangeFilter = TimeRangeFilter.between(startTime, endTime),
                dataOriginFilter = setOf(DataOrigin(appPackageName))
            )
        )
        // The result may be null if no data is available in the time range
        val totalSteps = response[StepsRecord.COUNT_TOTAL] ?: 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] ?: 0L
        val maximumHeartRate = response[HeartRateRecord.BPM_MAX] ?: 0L
    } 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. Anda dapat menggunakan pasangan objek Instant atau LocalDateTime untuk startTime dan endTime di TimeRangeFilter.

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] ?: 0L
        }
    } 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] ?: 0L
        }
    } catch (e: Exception) {
        // Run error handling here
    }
}

Membaca batasan

Secara default, semua aplikasi dapat membaca data dari Health Connect hingga 30 hari sebelum izin apa pun pertama kali diberikan.

Jika Anda perlu memperluas izin baca di luar batasan default, minta PERMISSION_READ_HEALTH_DATA_HISTORY. Jika tidak, tanpa izin ini, upaya untuk membaca data yang lebih lama dari 30 hari akan menghasilkan error.

Histori izin untuk aplikasi yang dihapus

Jika pengguna menghapus aplikasi Anda, semua izin, termasuk izin histori, akan dicabut. Jika pengguna menginstal ulang aplikasi Anda dan memberikan izin lagi, batasan default yang sama akan berlaku, dan aplikasi Anda dapat membaca data dari Health Connect hingga 30 hari sebelum tanggal baru tersebut.

Misalnya, pengguna menghapus aplikasi Anda pada 10 Mei 2023, lalu menginstal ulang aplikasi pada 15 Mei 2023, dan memberikan izin baca. Tanggal awal data yang dapat dibaca aplikasi Anda sekarang secara default adalah 15 April 2023.

Menggabungkan data yang terpengaruh oleh prioritas aplikasi yang dipilih pengguna

Pengguna akhir dapat menetapkan prioritas untuk aplikasi Tidur dan Aktivitas yang telah mereka integrasikan dengan Health Connect. Hanya pengguna akhir yang dapat mengubah daftar prioritas ini. Saat Anda melakukan pembacaan gabungan, Aggregate API akan memperhitungkan data duplikat dan hanya menyimpan data dari aplikasi dengan prioritas tertinggi. Data duplikat dapat muncul jika pengguna memiliki beberapa aplikasi yang menulis jenis data yang sama—seperti jumlah langkah yang dilakukan atau jarak yang ditempuh—pada waktu yang sama.

Gambar yang menampilkan Urutkan ulang prioritas aplikasi
Gambar 1: Mengatur ulang prioritas aplikasi

Gambar yang menunjukkan pengurutan ulang prioritas aplikasi

Untuk mengetahui informasi tentang cara pengguna akhir dapat memprioritaskan aplikasi mereka, lihat Mengelola data Health Connect.

Pengguna dapat menambahkan atau menghapus aplikasi serta mengubah prioritasnya. Pengguna mungkin ingin menghapus aplikasi yang menulis data duplikat sehingga total data di layar Health Connect sama dengan aplikasi yang telah diberi prioritas tertinggi. Total data diperbarui secara real time.

Meskipun Aggregate API menghitung data aplikasi Aktivitas dan Tidur dengan menghapus duplikat data sesuai dengan cara pengguna telah menetapkan prioritas, Anda tetap dapat membuat logika Anda sendiri untuk menghitung data secara terpisah untuk setiap aplikasi yang menulis data tersebut.

Hanya jenis data Aktivitas dan Tidur yang dihilangkan duplikasinya oleh Health Connect, dan total data yang ditampilkan adalah nilai setelah penghilangan duplikat dilakukan oleh Aggregate API. Total ini menampilkan hari penuh terbaru saat data langkah dan jarak tersedia. Untuk jenis data lainnya, hasil gabungan menggabungkan semua data jenis tersebut di Health Connect dari semua aplikasi yang menulis data.

Pembacaan latar belakang

Anda dapat meminta agar aplikasi Anda berjalan di latar belakang dan membaca data dari Health Connect. Jika Anda meminta izin Baca di Latar Belakang, pengguna dapat memberikan akses kepada aplikasi Anda untuk membaca data di latar belakang.

Jenis data gabungan yang didukung menurut rekaman

Tabel ini mencantumkan semua jenis data gabungan yang didukung oleh catatan Health Connect.

Tabel: Jenis data gabungan yang didukung menurut data
Rekam Jenis data gabungan
ActiveCaloriesBurnedRecord ACTIVE_CALORIES_TOTAL
ActivityIntensityRecord DURATION_TOTAL, INTENSITY_MINUTES_TOTAL, MODERATE_DURATION_TOTAL, VIGOROUS_DURATION_TOTAL
BasalMetabolicRateRecord BASAL_CALORIES_TOTAL
BloodPressureRecord DIASTOLIC_AVG, DIASTOLIC_MAX, DIASTOLIC_MIN, SYSTOLIC_AVG, SYSTOLIC_MAX, SYSTOLIC_MIN
CyclingPedalingCadenceRecord RPM_AVG, RPM_MAX, RPM_MIN
DistanceRecord DISTANCE_TOTAL
ElevationGainedRecord ELEVATION_GAINED_TOTAL
ExerciseSessionRecord EXERCISE_DURATION_TOTAL
FloorsClimbedRecord FLOORS_CLIMBED_TOTAL
HeartRateRecord BPM_AVG, BPM_MAX, BPM_MIN, MEASUREMENTS_COUNT
HeightRecord HEIGHT_AVG, HEIGHT_MAX, HEIGHT_MIN
HydrationRecord VOLUME_TOTAL
MindfulnessSessionRecord MINDFULNESS_DURATION_TOTAL
NutritionRecord BIOTIN_TOTAL, CAFFEINE_TOTAL, CALCIUM_TOTAL, CHLORIDE_TOTAL, CHOLESTEROL_TOTAL, CHROMIUM_TOTAL, COPPER_TOTAL, DIETARY_FIBER_TOTAL, ENERGY_FROM_FAT_TOTAL, ENERGY_TOTAL, FOLATE_TOTAL, FOLIC_ACID_TOTAL, IODINE_TOTAL, IRON_TOTAL, MAGNESIUM_TOTAL, MANGANESE_TOTAL, MOLYBDENUM_TOTAL, MONOUNSATURATED_FAT_TOTAL, NIACIN_TOTAL, PANTOTHENIC_ACID_TOTAL, PHOSPHORUS_TOTAL, POLYUNSATURATED_FAT_TOTAL, POTASSIUM_TOTAL, PROTEIN_TOTAL, RIBOFLAVIN_TOTAL, SATURATED_FAT_TOTAL, SELENIUM_TOTAL, SODIUM_TOTAL, SUGAR_TOTAL, THIAMIN_TOTAL, TOTAL_CARBOHYDRATE_TOTAL, TOTAL_FAT_TOTAL, TRANS_FAT_TOTAL, UNSATURATED_FAT_TOTAL, VITAMIN_A_TOTAL, VITAMIN_B12_TOTAL, VITAMIN_B6_TOTAL, VITAMIN_C_TOTAL, VITAMIN_D_TOTAL, VITAMIN_E_TOTAL, VITAMIN_K_TOTAL, ZINC_TOTAL
PowerRecord POWER_AVG, POWER_MAX, POWER_MIN
RestingHeartRateRecord BPM_AVG, BPM_MAX, BPM_MIN
SkinTemperatureRecord TEMPERATURE_DELTA_AVG, TEMPERATURE_DELTA_MAX, TEMPERATURE_DELTA_MIN
SleepSessionRecord SLEEP_DURATION_TOTAL
SpeedRecord SPEED_AVG, SPEED_MAX, SPEED_MIN
StepsRecord COUNT_TOTAL
StepsCadenceRecord RATE_AVG, RATE_MAX, RATE_MIN
TotalCaloriesBurnedRecord ENERGY_TOTAL
WeightRecord WEIGHT_AVG, WEIGHT_MAX, WEIGHT_MIN
WheelchairPushesRecord COUNT_TOTAL