อ่านข้อมูลรวม

การรวมข้อมูลใน Health Connect มีทั้งการรวมข้อมูลพื้นฐานหรือการรวมข้อมูลเป็นที่เก็บข้อมูล เวิร์กโฟลว์ต่อไปนี้จะแสดงวิธีดำเนินการทั้ง 2 อย่าง

การรวมข้อมูลพื้นฐาน

หากต้องการใช้การรวมข้อมูลพื้นฐานกับข้อมูล ให้ใช้ฟังก์ชัน aggregate ในออบเจ็กต์ HealthConnectClient ฟังก์ชันนี้ยอมรับออบเจ็กต์ AggregateRequest ซึ่งคุณจะเพิ่มประเภทเมตริก และช่วงเวลาเป็นพารามิเตอร์ วิธีเรียกข้อมูลรวมพื้นฐานจะขึ้นอยู่กับประเภทเมตริกที่ใช้

การรวมข้อมูลสะสม

การรวมข้อมูลสะสมจะคำนวณค่าทั้งหมด

ตัวอย่างต่อไปนี้แสดงวิธีรวมข้อมูลสำหรับประเภทข้อมูล

suspend fun readDistanceAggregate(startTime: Instant, endTime: Instant): Number {
    val response = healthConnectClient.aggregate(
        AggregateRequest(
            metrics = setOf(DistanceRecord.DISTANCE_TOTAL),
            timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
        )
    )
    return response[DistanceRecord.DISTANCE_TOTAL]?.inMeters ?: 0L
}

กรองตามแหล่งที่มาของข้อมูล

นอกจากนี้ คุณยังกรองข้อมูลรวมตามแหล่งที่มาได้ด้วย เช่น รวมเฉพาะข้อมูลที่เขียนโดยแอปที่เฉพาะเจาะจง

ตัวอย่างต่อไปนี้แสดงวิธีใช้ dataOriginFilter และ AggregateRequest เพื่อรวมจำนวนก้าวจากแอปที่เฉพาะเจาะจง

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

การรวมข้อมูลทางสถิติ

การรวมข้อมูลทางสถิติจะคำนวณค่าต่ำสุด สูงสุด หรือค่าเฉลี่ยของบันทึกที่มีตัวอย่าง

ตัวอย่างต่อไปนี้แสดงวิธีใช้การรวมข้อมูลทางสถิติ

suspend fun readHeartRateAggregate(startTime: Instant, endTime: Instant): Pair<Long, Long> {
    val response = healthConnectClient.aggregate(
        AggregateRequest(
            metrics = setOf(HeartRateRecord.BPM_MAX, HeartRateRecord.BPM_MIN),
            timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
        )
    )
    val minimumHeartRate = response[HeartRateRecord.BPM_MIN] ?: 0L
    val maximumHeartRate = response[HeartRateRecord.BPM_MAX] ?: 0L

    return maximumHeartRate to minimumHeartRate
}

ที่เก็บข้อมูล

Health Connect ยังให้คุณรวมข้อมูลเป็น ที่เก็บข้อมูลได้ด้วย ที่เก็บข้อมูลที่คุณใช้ได้มี 2 ประเภท ได้แก่ ระยะเวลา และระยะเวลา

เมื่อเรียกใช้แล้ว ฟังก์ชันเหล่านี้จะแสดงผลรายการที่เก็บข้อมูล โปรดทราบว่ารายการอาจมีข้อมูลไม่ครบถ้วน ดังนั้นระบบจะไม่รวมที่เก็บข้อมูลไว้ในรายการหากที่เก็บข้อมูลนั้นไม่มีข้อมูล

ระยะเวลา

ในกรณีนี้ ระบบจะแบ่งข้อมูลรวมออกเป็นที่เก็บข้อมูลภายในระยะเวลาที่กำหนด เช่น 1 นาทีหรือ 1 ชั่วโมง หากต้องการรวมข้อมูลเป็นที่เก็บข้อมูล ให้ใช้ aggregateGroupByDuration ฟังก์ชันนี้ยอมรับออบเจ็กต์ AggregateGroupByDurationRequest ซึ่งคุณจะเพิ่มประเภทเมตริก ช่วงเวลา และ Duration เป็นพารามิเตอร์ คุณสามารถใช้คู่ของ Instant หรือ LocalDateTime ออบเจ็กต์สำหรับ startTime และ endTime ใน TimeRangeFilter

ตัวอย่างต่อไปนี้แสดงการรวมจำนวนก้าวเป็นที่เก็บข้อมูลที่มีระยะเวลา 1 นาที

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

ระยะเวลา

ในกรณีนี้ ระบบจะแบ่งข้อมูลรวมออกเป็นที่เก็บข้อมูลภายในระยะเวลาที่อิงตามวันที่ เช่น 1 สัปดาห์หรือ 1 เดือน หากต้องการรวมข้อมูลเป็นที่เก็บข้อมูล ให้ใช้ aggregateGroupByPeriod ฟังก์ชันนี้ยอมรับออบเจ็กต์ AggregateGroupByPeriodRequest ซึ่งคุณจะเพิ่มประเภทเมตริก ช่วงเวลา และ Period เป็นพารามิเตอร์

ตัวอย่างต่อไปนี้แสดงการรวมจำนวนก้าวเป็นที่เก็บข้อมูลรายเดือน

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

ข้อจำกัดในการอ่าน

โดยค่าเริ่มต้น แอปพลิเคชันทั้งหมดสามารถอ่านข้อมูลจาก Health Connect ได้เป็นเวลาสูงสุด 30 วันก่อนวันที่ได้รับสิทธิ์ครั้งแรก

หากต้องการขยายสิทธิ์อ่านนอกเหนือจากข้อจำกัด เริ่มต้น ให้ขอ PERMISSION_READ_HEALTH_DATA_HISTORY ไม่เช่นนั้น หากไม่มีสิทธิ์นี้ การพยายามอ่านบันทึกที่เก่ากว่า 30 วันจะทำให้เกิดข้อผิดพลาด

ประวัติสิทธิ์ของแอปที่ถูกลบ

หากผู้ใช้ลบแอปของคุณ ระบบจะเพิกถอนสิทธิ์ทั้งหมด รวมถึงสิทธิ์ประวัติ หากผู้ใช้ติดตั้งแอปของคุณอีกครั้งและให้สิทธิ์อีกครั้ง ข้อจำกัดเริ่มต้นเดียวกันจะมีผล และแอปของคุณจะอ่านข้อมูลจาก Health Connect ได้เป็นเวลาสูงสุด 30 วันก่อนวันที่ใหม่นั้น

เช่น สมมติว่าผู้ใช้ลบแอปของคุณในวันที่ 10 พฤษภาคม 2023 จากนั้นติดตั้งแอปอีกครั้งในวันที่ 15 พฤษภาคม 2023 และให้สิทธิ์อ่าน วันที่เร็วที่สุดที่แอปของคุณจะอ่านข้อมูลได้โดยค่าเริ่มต้นคือ15 เมษายน 2023

ข้อมูลรวมที่ได้รับผลกระทบจากลำดับความสำคัญของแอปที่ผู้ใช้เลือก

ผู้ใช้ปลายทางสามารถกำหนดลำดับความสำคัญสำหรับแอปการนอนหลับและแอปกิจกรรมที่ผสานรวมกับ Health Connect มีเพียงผู้ใช้ปลายทางเท่านั้นที่สามารถเปลี่ยนแปลงรายการลำดับความสำคัญเหล่านี้ได้ เมื่อคุณอ่านข้อมูลรวม API การรวมจะพิจารณาข้อมูลที่ซ้ำกันและเก็บเฉพาะข้อมูลจากแอปที่มีลำดับความสำคัญสูงสุด ข้อมูลที่ซ้ำกันอาจเกิดขึ้นได้หากผู้ใช้มีแอปหลายแอปที่เขียนข้อมูลประเภทเดียวกัน เช่น จำนวนก้าวที่เดินหรือระยะทางที่เคลื่อนที่ได้ ในเวลาเดียวกัน

รูปภาพแสดงการจัดลำดับความสำคัญของแอปใหม่
รูปที่ 1: จัดลำดับความสำคัญของแอปใหม่

รูปภาพแสดงการจัดลำดับความสำคัญของแอปใหม่

ดูข้อมูลเกี่ยวกับวิธีที่ผู้ใช้ปลายทางจัดลำดับความสำคัญของแอปได้ที่ ดูจัดการข้อมูล Health Connect

ผู้ใช้สามารถเพิ่มหรือนำแอปออก รวมถึงเปลี่ยนลำดับความสำคัญของแอปได้ ผู้ใช้อาจต้องการนำแอปที่เขียนข้อมูลซ้ำออกเพื่อให้ผลรวมของข้อมูลในหน้าจอ Health Connect เหมือนกับแอปที่ผู้ใช้ให้ลำดับความสำคัญสูงสุด ระบบจะอัปเดตผลรวมของข้อมูลแบบเรียลไทม์

แม้ว่า API การรวมจะคำนวณข้อมูลของแอปกิจกรรมและแอปการนอนหลับโดยการลบข้อมูลที่ซ้ำกันตามวิธีที่ผู้ใช้ตั้งค่าลำดับความสำคัญไว้ แต่คุณยังคงสร้างตรรกะของคุณเองเพื่อคำนวณข้อมูลแยกกันสำหรับแต่ละแอปที่เขียนข้อมูลนั้นได้

Health Connect จะลบข้อมูลที่ซ้ำกันเฉพาะข้อมูลประเภทกิจกรรมและข้อมูลการนอนหลับเท่านั้น และผลรวมของข้อมูลที่แสดงจะเป็นค่าหลังจากที่ API การรวมลบข้อมูลที่ซ้ำกันแล้ว ผลรวมเหล่านี้จะแสดงข้อมูลของวันล่าสุดที่ข้อมูลจำนวนก้าวและระยะทางมีอยู่ สำหรับข้อมูลประเภทอื่นๆ ผลลัพธ์รวมจะรวมข้อมูลทั้งหมดของประเภทนั้นใน Health Connect จากแอปทั้งหมดที่เขียนข้อมูล

การอ่านอยู่เบื้องหลัง

คุณขอให้แอปพลิเคชันทำงานอยู่เบื้องหลังและอ่านข้อมูลจาก Health Connect ได้ หากคุณขอสิทธิ์ อ่านอยู่เบื้องหลัง ผู้ใช้จะให้สิทธิ์แอปของคุณในการอ่านข้อมูลอยู่เบื้องหลังได้

ประเภทข้อมูลรวมที่รองรับตามบันทึก

ตารางนี้แสดงรายการประเภทข้อมูลรวมทั้งหมดที่รองรับตามบันทึก Health Connect

ตาราง: ประเภทข้อมูลรวมที่รองรับตามบันทึก
บันทึก ประเภทข้อมูลรวม
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