קריאה של נתונים נצברים

צבירת נתונים ב-Health Connect כוללת צבירות בסיסיות או צבירת נתונים בקטגוריות. בתהליכי העבודה הבאים מוסבר איך לעשות את שניהם.

צבירת נתונים בסיסית

כדי להשתמש בצבירה בסיסית של הנתונים, משתמשים בפונקציה aggregate באובייקט HealthConnectClient. הפונקציה מקבלת אובייקט AggregateRequest שבו מוסיפים את סוגי המדדים ואת טווח הזמן כפרמטרים. אופן הקריאה של צבירות בסיסיות תלוי בסוגים של המדדים שבהם נעשה שימוש.

צבירת נתונים מצטברת

צבירה מצטברת מחשבת את הערך הכולל.

בדוגמה הבאה מוסבר איך לצבור נתונים לפי סוג נתונים:

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

צבירת נתונים סטטיסטית

צבירה סטטיסטית מחשבת את הערכים המינימלי, המקסימלי או הממוצע של רשומות עם דגימות.

בדוגמה הבאה מוסבר איך משתמשים בצבירה סטטיסטית:

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

קטגוריות

ב-Health Connect אפשר גם לצבור נתונים בקטגוריות. שני הסוגים של קטגוריות שאפשר להשתמש בהן הם duration ו-period.

לאחר הקריאה, הן מחזירות רשימה של קטגוריות. חשוב לזכור שהרשימה יכולה להיות דלילה, ולכן קטגוריה לא תופיע ברשימה אם היא לא מכילה נתונים.

משך הזמן

במקרה כזה, הנתונים המצטברים מחולקים לקטגוריות לפי פרק זמן קבוע, כמו דקה או שעה. כדי לצבור נתונים בקטגוריות, משתמשים ב-aggregateGroupByDuration. הפונקציה מקבלת אובייקט AggregateGroupByDurationRequest שבו מוסיפים את סוגי המדדים, את טווח הזמן ואת Duration כפרמטרים.

בדוגמה הבאה מוצגת צבירה של שלבים לקטגוריות של דקות:

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

נקודה

במקרה כזה, הנתונים המצטברים מחולקים לקטגוריות לפי פרק זמן שמבוסס על תאריך, כמו שבוע או חודש. כדי לצבור נתונים בקטגוריות, משתמשים ב-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]
        }
    } 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. רק משתמשי הקצה יכולים לשנות את רשימות העדיפויות האלה. כשמבצעים קריאה מצטברת, Aggregate API מתייחס לנתונים כפולים ושומר רק את הנתונים מהאפליקציה עם רמת העדיפות הגבוהה ביותר. נתונים כפולים יכולים להופיע אם למשתמש יש כמה אפליקציות שכותבות את אותו סוג של נתונים – כמו מספר הצעדים או המרחק שעבר – בו-זמנית.

במאמר ניהול הנתונים ב-Health Connect מוסבר איך משתמשי הקצה יכולים לתת עדיפות לאפליקציות שלהם.

המשתמש יכול להוסיף או להסיר אפליקציות וגם לשנות את העדיפויות שלהן. משתמשים יכולים להסיר אפליקציה שכותבת נתונים כפולים כדי שסכומי הנתונים במסך של Health Connect יהיו זהים לאפליקציה שהם העניקו לה את העדיפות הגבוהה ביותר. הסכומים הכוללים של הנתונים מתעדכנים בזמן אמת.

אמנם Aggregate API מחשב את הנתונים של אפליקציות הפעילות והשינה על ידי הסרת כפילויות בהתאם לעדיפויות שהמשתמש הגדיר, אבל עדיין אפשר ליצור לוגיקה משלכם כדי לחשב את הנתונים בנפרד לכל אפליקציה שכותבת את הנתונים האלה.

מערכת Health Connect מסירה כפילויות רק בסוגי הנתונים 'פעילות' ו'שינה', והסכומים הכוללים של הנתונים שמוצגים הם הערכים אחרי שהמערכת מסירה את הכפילויות באמצעות Aggregate API. הסכומים הכוללים האלה מייצגים את היום המלא האחרון שבו יש נתונים לגבי מספר הצעדים והמרחק. לגבי סוגי אפליקציות אחרים, המספרים הכוללים של כל האפליקציות האלה מוצגים בסיכומי הנתונים ב-Health Connect.

קריאה ברקע

אתם יכולים לבקש שהאפליקציה תרוץ ברקע ותוכל לקרוא נתונים מ-Health Connect. אם מבקשים את ההרשאה קריאה ברקע, המשתמש יכול להעניק לאפליקציה גישה לקריאת נתונים ברקע.

סוגי נתונים מצטברים נתמכים לפי רשומה

בטבלה הזו מפורטים כל סוגי הנתונים המצטברים שנתמכים לפי רשומה ב-Health Connect.

הקלטה סוג הנתונים המצטברים
ActiveCaloriesBurnedRecord ACTIVE_CALORIES_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, 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, 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
TotalCaloriesBurnedRecord ENERGY_TOTAL
WeightRecord WEIGHT_AVG, WEIGHT_MAX, WEIGHT_MIN
WheelchairPushesRecord COUNT_TOTAL