قراءة البيانات المجمّعة

يتضمّن تجميع البيانات في 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
    }
}

الفلترة حسب مصدر البيانات

يمكنك أيضًا فلترة البيانات المجمّعة حسب مصدرها. على سبيل المثال، تضمين البيانات التي كتبها تطبيق معيّن فقط

يوضِّح المثال التالي كيفية استخدام 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 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
    }
}

حاويات

يمكن أن يتيح لك تطبيق Health Connect أيضًا تجميع البيانات في حِزم. يتضمّن النوعان من الحِزم التي يمكنك استخدامها المدة والفترة.

وبعد استدعائها، تعرض قائمة بالحِزم. يُرجى العِلم أنّ القائمة يمكن أن تكون متفرّقة، لذا لا يتم تضمين أي حزمة في القائمة إذا كانت لا تحتوي على أي بيانات.

المدة

في هذه الحالة، يتم تقسيم البيانات المجمّعة إلى مجموعات ضمن مدة زمنية ثابتة، مثل دقيقة أو ساعة. لتجميع البيانات في حِزم، استخدِم aggregateGroupByDuration. تقبل هذه الدالة عنصر AggregateGroupByDurationRequest يمكنك من خلاله إضافة أنواع المقاييس والنطاق الزمني وDuration كمعلَمات. يمكنك استخدام أزواج من الكائنات Instant أو LocalDateTime للعنصرين startTime وendTime في TimeRangeFilter.

يوضّح المثال التالي كيفية تجميع الخطوات في فترات زمنية مدتها دقيقة واحدة:

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

نقطة

في هذه الحالة، يتم تقسيم البيانات المجمّعة إلى مجموعات ضمن فترة زمنية مستندة إلى التاريخ، مثل أسبوع أو شهر. لتجميع البيانات في حِزم، استخدِم 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. يمكن للمستخدمين النهائيين فقط تغيير قوائم الأولوية هذه. عند إجراء قراءة مجمّعة، تأخذ واجهة Aggregate API في الاعتبار أي بيانات مكرّرة وتحتفظ فقط بالبيانات من التطبيق الذي لديه أعلى أولوية. قد توجد بيانات مكرّرة إذا كان لدى المستخدم تطبيقات متعدّدة تكتب النوع نفسه من البيانات، مثل عدد الخطوات التي تم اتخاذها أو المسافة المقطوعة، في الوقت نفسه.

صورة تعرض إعادة ترتيب أولويات التطبيقات
الشكل 1: إعادة ترتيب أولويات التطبيقات

صورة توضّح كيفية إعادة ترتيب أولويات التطبيقات

للحصول على معلومات حول كيفية تحديد المستخدمين النهائيين لأولوية تطبيقاتهم، يُرجى الاطّلاع على إدارة بيانات Health Connect.

يمكن للمستخدم إضافة تطبيقات أو إزالتها بالإضافة إلى تغيير أولوياتها. قد يريد المستخدم إزالة تطبيق يكتب بيانات مكرّرة حتى يتطابق إجمالي البيانات على شاشة Health Connect مع بيانات التطبيق الذي منحته أعلى أولوية. يتم تعديل إجمالي البيانات في الوقت الفعلي.

على الرغم من أنّ واجهة برمجة التطبيقات Aggregate API تحتسب بيانات تطبيقات "النشاط" و"النوم" من خلال إزالة البيانات المكرّرة وفقًا للطريقة التي حدّد بها المستخدم الأولويات، يمكنك إنشاء منطقك الخاص لاحتساب البيانات بشكل منفصل لكل تطبيق يكتب هذه البيانات.

لا يزيل تطبيق Health Connect البيانات المكرّرة إلا من نوعَي البيانات "النشاط" و"النوم"، وتكون إجماليات البيانات المعروضة هي القيم بعد إزالة البيانات المكرّرة من خلال واجهة برمجة التطبيقات Aggregate 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