كتابة البيانات

يتوافق هذا الدليل مع الإصدار 1.1.0-alpha12 من Health Connect.

يغطّي هذا الدليل عملية كتابة البيانات أو تعديلها في Health Connect.

التعامل مع القيم الصفرية

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

إعداد بنية البيانات

قبل كتابة البيانات، علينا إعداد السجلات أولاً. بالنسبة إلى أكثر من 50 نوعًا من البيانات، لكل نوع منها بنيته الخاصة. يمكنك الاطّلاع على مرجع Jetpack للحصول على مزيد من التفاصيل حول أنواع البيانات المتاحة.

السجلات الأساسية

يسجّل نوع بيانات الخطوات في Health Connect عدد الخطوات التي اتّخذها المستخدم بين القراءات. تمثّل أعداد الخطوات مقياسًا شائعًا في جميع منصات الصحة واللياقة البدنية والعافية.

يوضّح المثال التالي كيفية ضبط بيانات عدد الخطوات:

val endTime = Instant.now()
val startTime = endTime.minus(Duration.ofMinutes(15))

val stepsRecord = StepsRecord(
    count = 120,
    startTime = startTime,
    endTime = endTime,
    startZoneOffset = ZoneOffset.UTC,
    endZoneOffset = ZoneOffset.UTC,
    metadata = Metadata.autoRecorded(
        device = Device(type = Device.TYPE_WATCH)
    )
)

السجلات التي تتضمّن وحدات قياس

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

في نوع البيانات هذا، يتم تمثيل جميع العناصر الغذائية بوحدات Mass، بينما يتم تمثيل energy بوحدة Energy.

يوضّح المثال التالي كيفية ضبط بيانات التغذية لمستخدم تناول موزة:

val endTime = Instant.now()
val startTime = endTime.minus(Duration.ofMinutes(1))

val banana = NutritionRecord(
    name = "banana",
    energy = 105.0.kilocalories,
    dietaryFiber = 3.1.grams,
    potassium = 0.422.grams,
    totalCarbohydrate = 27.0.grams,
    totalFat = 0.4.grams,
    saturatedFat = 0.1.grams,
    sodium = 0.001.grams,
    sugar = 14.0.grams,
    vitaminB6 = 0.0005.grams,
    vitaminC = 0.0103.grams,
    startTime = startTime,
    endTime = endTime,
    startZoneOffset = ZoneOffset.UTC,
    endZoneOffset = ZoneOffset.UTC,
    metadata = Metadata.manualEntry(
        device = Device(type = Device.TYPE_PHONE)
    )
)

السجلات التي تتضمّن بيانات سلسلة

يمكن لتطبيق Health Connect تخزين قائمة ببيانات السلسلة. أحد الأمثلة على ذلك هو نوع البيانات معدّل نبضات القلب الذي يسجّل سلسلة من عيّنات نبضات القلب التي تم رصدها بين القراءات.

في نوع البيانات هذا، يتم تمثيل المَعلمة samples بقائمة من عينات معدّل نبضات القلب. تحتوي كل عيّنة على قيمة beatsPerMinute وقيمة time.

يوضّح المثال التالي كيفية ضبط بيانات سلسلة معدّل ضربات القلب:

val endTime = Instant.now()
val startTime = endTime.minus(Duration.ofMinutes(5))

val heartRateRecord = HeartRateRecord(
    startTime = startTime,
    startZoneOffset = ZoneOffset.UTC,
    endTime = endTime,
    endZoneOffset = ZoneOffset.UTC,
    // records 10 arbitrary data, to replace with actual data
    samples = List(10) { index ->
        HeartRateRecord.Sample(
            time = startTime + Duration.ofSeconds(index.toLong()),
            beatsPerMinute = 100 + index.toLong(),
        )
    },
    metadata = Metadata.autoRecorded(
        device = Device(type = Device.TYPE_WATCH)
    ))

طلب الأذونات من المستخدم

بعد إنشاء مثيل للعميل، يحتاج تطبيقك إلى طلب أذونات من المستخدم. يجب السماح للمستخدمين بمنح الأذونات أو رفضها في أي وقت.

لإجراء ذلك، أنشئ مجموعة من الأذونات لأنواع البيانات المطلوبة. تأكَّد من أنّ الأذونات في المجموعة معرَّفة في بيان Android أولاً.

// Create a set of permissions for required data types
val PERMISSIONS =
    setOf(
  HealthPermission.getReadPermission(HeartRateRecord::class),
  HealthPermission.getWritePermission(HeartRateRecord::class),
  HealthPermission.getReadPermission(StepsRecord::class),
  HealthPermission.getWritePermission(StepsRecord::class)
)

استخدِم getGrantedPermissions لمعرفة ما إذا كان تطبيقك قد حصل على الأذونات المطلوبة. إذا لم يكن الأمر كذلك، استخدِم createRequestPermissionResultContract لطلب هذه الأذونات. سيؤدي ذلك إلى عرض شاشة أذونات Health Connect.

// Create the permissions launcher
val requestPermissionActivityContract = PermissionController.createRequestPermissionResultContract()

val requestPermissions = registerForActivityResult(requestPermissionActivityContract) { granted ->
  if (granted.containsAll(PERMISSIONS)) {
    // Permissions successfully granted
  } else {
    // Lack of required permissions
  }
}

suspend fun checkPermissionsAndRun(healthConnectClient: HealthConnectClient) {
  val granted = healthConnectClient.permissionController.getGrantedPermissions()
  if (granted.containsAll(PERMISSIONS)) {
    // Permissions already granted; proceed with inserting or reading data
  } else {
    requestPermissions.launch(PERMISSIONS)
  }
}

بما أنّ المستخدمين يمكنهم منح الأذونات أو إبطالها في أي وقت، يجب أن يتحقّق تطبيقك بشكل دوري من الأذونات الممنوحة وأن يتعامل مع السيناريوهات التي يتم فيها فقدان الإذن.

كتابة البيانات

أحد إجراءات سير العمل الشائعة في Health Connect هو كتابة البيانات. لإضافة سجلّات، استخدِم insertRecords.

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

suspend fun insertSteps(healthConnectClient: HealthConnectClient) {
    val endTime = Instant.now()
    val startTime = endTime.minus(Duration.ofMinutes(5))
    try {
        val stepsRecord = StepsRecord(
            count = 120,
            startTime = startTime,
            endTime = endTime,
            startZoneOffset = ZoneOffset.UTC,
            endZoneOffset = ZoneOffset.UTC,
            metadata = Metadata.autoRecorded(
                device = Device(type = Device.TYPE_WATCH)
            )
        )
        healthConnectClient.insertRecords(listOf(stepsRecord))
    } catch (e: Exception) {
        // Run error handling here
    }
}

تعديل البيانات

إذا كنت بحاجة إلى تغيير سجلّ واحد أو أكثر، خاصةً عندما تحتاج إلى مزامنة مخزن بيانات تطبيقك مع بيانات من Health Connect، يمكنك تعديل بياناتك. تتوفّر طريقتان لتعديل البيانات الحالية، وتعتمدان على المعرّف المستخدَم للعثور على السجلات.

البيانات الوصفية

من المفيد فحص الفئة Metadata أولاً لأنّها ضرورية عند تعديل البيانات. عند إنشاء كل Record في Health Connect، يتم تضمين حقل metadata. في ما يلي السمات ذات الصلة بالمزامنة:

الخصائص الوصف
id يحتوي كل Record في Health Connect على قيمة id فريدة.
يملأ تطبيق Health Connect هذا الحقل تلقائيًا عند إدراج سجلّ جديد.
lastModifiedTime يتتبّع كل Record أيضًا آخر مرة تم فيها تعديل السجلّ.
يملأ تطبيق Health Connect هذا الحقل تلقائيًا.
clientRecordId يمكن أن يتضمّن كل Record معرّفًا فريدًا مرتبطًا به ليتم استخدامه كمرجع في مستودع بيانات تطبيقك.
يوفّر تطبيقك هذه القيمة.
clientRecordVersion عندما يتضمّن السجلّ clientRecordId، يمكن استخدام clientRecordVersion للسماح بمزامنة البيانات مع الإصدار في مستودع بيانات التطبيق.
يوفّر تطبيقك هذه القيمة.

تعديل بعد القراءة حسب النطاق الزمني

لتعديل البيانات، عليك إعداد السجلات المطلوبة أولاً. أجرِ أي تغييرات على السجلات إذا لزم الأمر. بعد ذلك، اتّصِل بالرقم updateRecords لإجراء التغييرات.

يوضّح المثال التالي كيفية تعديل البيانات. لهذا الغرض، يتم تعديل قيم إزاحة المنطقة الزمنية لكل سجل لتصبح بتوقيت المحيط الهادئ.

suspend fun updateSteps(
    healthConnectClient: HealthConnectClient,
    prevRecordStartTime: Instant,
    prevRecordEndTime: Instant
) {
    try {
        val request = healthConnectClient.readRecords(
            ReadRecordsRequest(
                recordType = StepsRecord::class, timeRangeFilter = TimeRangeFilter.between(
                    prevRecordStartTime, prevRecordEndTime
                )
            )
        )

        val newStepsRecords = arrayListOf<StepsRecord>()
        for (record in request.records) {
            // Adjusted both offset values to reflect changes
            val sr = StepsRecord(
                count = record.count,
                startTime = record.startTime,
                startZoneOffset = record.startTime.atZone(ZoneId.of("PST")).offset,
                endTime = record.endTime,
                endZoneOffset = record.endTime.atZone(ZoneId.of("PST")).offset,
                metadata = record.metadata
            )
            newStepsRecords.add(sr)
        }

        healthConnectClient.updateRecords(newStepsRecords)
    } catch (e: Exception) {
        // Run error handling here
    }
}

إجراء عملية إدراج أو تعديل من خلال معرّف سجلّ العميل

في حال استخدام قيمتَي Client Record ID وClient Record Version الاختياريتَين، ننصحك باستخدام insertRecords بدلاً من updateRecords.

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

يوضّح المثال التالي كيفية إجراء عملية إدراج أو تعديل على البيانات التي تم استرجاعها من مستودع بيانات التطبيق:

suspend fun pullStepsFromDatastore() : ArrayList<StepsRecord> {
    val appStepsRecords = arrayListOf<StepsRecord>()
    // Pull data from app datastore
    // ...
    // Make changes to data if necessary
    // ...
    // Store data in appStepsRecords
    // ...
    var sr = StepsRecord(
        metadata = Metadata.autoRecorded(
            clientRecordId = "Your client record ID",
            device = Device(type = Device.TYPE_WATCH)
        ),
        // Assign more parameters for this record
    )
    appStepsRecords.add(sr)
    // ...
    return appStepsRecords
}

suspend fun upsertSteps(
    healthConnectClient: HealthConnectClient,
    newStepsRecords: ArrayList<StepsRecord>
) {
    try {
        healthConnectClient.insertRecords(newStepsRecords)
    } catch (e: Exception) {
        // Run error handling here
    }
}

بعد ذلك، يمكنك استدعاء هذه الدوال في سلسلة التعليمات البرمجية الرئيسية.

upsertSteps(healthConnectClient, pullStepsFromDatastore())

التحقّق من القيمة في "إصدار سجلّ العميل"

إذا كانت عملية إدراج البيانات أو تعديلها تتضمّن Client Record Version، سيُجري تطبيق Health Connect عمليات تحقّق للمقارنة في clientRecordVersion القيم. إذا كان الإصدار من البيانات المُدرَجة أعلى من الإصدار من البيانات الحالية، سيتم إجراء عملية الإدراج والتعديل. بخلاف ذلك، تتجاهل العملية التغيير وتبقى القيمة كما هي.

لتضمين معلومات حول الإصدارات في بياناتك، عليك تقديم قيمة Long للسمة Metadata.clientRecordVersion استنادًا إلى منطق تحديد الإصدارات.

val endTime = Instant.now()
val startTime = endTime.minus(Duration.ofMinutes(15))

val stepsRecord = StepsRecord(
    count = 100L,
    startTime = startTime,
    startZoneOffset = ZoneOffset.UTC,
    endTime = endTime,
    endZoneOffset = ZoneOffset.UTC,
    metadata = Metadata.manualEntry(
        clientRecordId = "Your supplied record ID",
        clientRecordVersion = 0L, // Your supplied record version
        device = Device(type = Device.TYPE_WATCH)
    )
)

لا تزيد عمليات الإدراج والتعديل تلقائيًا قيمة version عند حدوث تغييرات، ما يمنع أي حالات غير متوقّعة من الكتابة فوق البيانات. في هذه الحالة، عليك تقديم قيمة أعلى يدويًا.

أفضل الممارسات لكتابة البيانات

يجب أن تكتب التطبيقات بيانات من مصادرها الخاصة فقط في Health Connect.

إذا تم استيراد البيانات في تطبيقك من تطبيق آخر، تقع مسؤولية تعديل البيانات في Health Connect على التطبيق الآخر.

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

عند تتبُّع البيانات، هناك بعض الاقتراحات التي يمكنك اتّباعها حسب الطريقة التي يكتب بها تطبيقك البيانات.

التعامل مع المناطق الزمنية

عند كتابة سجلات مستندة إلى الوقت، تجنَّب ضبط الإزاحات على zoneOffset.UTC تلقائيًا لأنّ ذلك قد يؤدي إلى طوابع زمنية غير دقيقة عندما يكون المستخدمون في مناطق أخرى. بدلاً من ذلك، احسب الإزاحة استنادًا إلى الموقع الجغرافي الفعلي للجهاز. يمكنك استرداد المنطقة الزمنية للجهاز باستخدام ZoneId.systemDefault().

val endTime = Instant.now()
val startTime = endTime.minus(java.time.Duration.ofDays(1))
val stepsRecords = mutableListOf<StepsRecord>()
var sampleTime = startTime
val minutesBetweenSamples = 15L
while (sampleTime < endTime) {
    // Get the default ZoneId then convert it to an offset
    val zoneOffset = ZoneOffset.systemDefault().rules.getOffset(sampleTime)
    stepsRecords += StepsRecord(
        startTime = sampleTime.minus(java.time.Duration.ofMinutes(minutesBetweenSamples)),
        startZoneOffset = zoneOffset,
        endTime = sampleTime,
        endZoneOffset = zoneOffset,
        count = Random.nextLong(1, 100),
        metadata = Metadata.unknownRecordingMethod(),
    )
    sampleTime = sampleTime.plus(java.time.Duration.ofMinutes(minutesBetweenSamples))
}
healthConnectClient.insertRecords(
    stepsRecords
)

لمزيد من التفاصيل، يُرجى الاطّلاع على مستندات ZoneId.

التتبُّع غير النشط

ويشمل ذلك التطبيقات التي تتتبّع اللياقة البدنية أو الصحة بشكل غير مباشر، مثل تسجيل الخطوات أو معدّل نبضات القلب باستمرار في الخلفية.

يجب أن ييكتب تطبيقك البيانات بشكل دوري في Health Connect بالطرق التالية:

  • عند إجراء كل عملية مزامنة، لا تكتب سوى البيانات الجديدة والبيانات المعدَّلة منذ آخر عملية مزامنة.
  • قسِّم الطلبات إلى أجزاء لا تتضمّن أكثر من 1,000 سجلّ لكل طلب كتابة.
  • استخدِم WorkManager لجدولة مهام دورية تعمل في الخلفية، على أن تكون الفترة الزمنية 15 دقيقة على الأقل.
  • تقييد تنفيذ المهام عندما يكون الجهاز في وضع عدم النشاط ومستوى شحن البطارية ليس منخفضًا
val constraints = Constraints.Builder()
    .requiresBatteryNotLow()
    .requiresDeviceIdle(true)
    .build()

val writeDataWork = PeriodicWorkRequestBuilder<WriteDataToHealthConnectWorker>(
        15,
        TimeUnit.MINUTES,
        5,
        TimeUnit.MINUTES
    )
    .setConstraints(constraints)
    .build()

التتبُّع النشط

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

تأكَّد من أنّ تطبيقك لا يبقي Health Connect قيد التشغيل طوال مدة الحدث.

يجب نقل البيانات إلى Health Connect بإحدى الطريقتَين التاليتَين:

  • مزامنة البيانات مع Health Connect بعد اكتمال الحدث على سبيل المثال، تتم مزامنة البيانات عندما ينهي المستخدم جلسة تمرين يتم تتبُّعها.
  • جدولة مهمة لمرة واحدة باستخدام WorkManager لمزامنة البيانات في وقت لاحق

أفضل الممارسات المتعلّقة بدقة البيانات وعدد مرات الكتابة

عند كتابة البيانات في Health Connect، استخدِم دقة مناسبة. يساعد استخدام الدقة المناسبة في تقليل عبء التخزين، مع الحفاظ على بيانات متسقة ودقيقة. يشمل تحليل البيانات أمرين:

  1. معدّل تكرار عمليات الكتابة: عدد المرات التي يرسل فيها تطبيقك أي بيانات جديدة إلى Health Connect. على سبيل المثال، كتابة بيانات جديدة كل 15 دقيقة
  2. دقة البيانات المكتوبة: عدد مرات أخذ عيّنات من البيانات التي تم إرسالها. على سبيل المثال، كتابة عيّنات معدّل نبضات القلب كل 5 ثوانٍ لا يتطلّب كل نوع من البيانات معدّل أخذ عيّنات مماثلاً. لا فائدة تُذكر من تعديل بيانات عدد الخطوات كل ثانية، مقارنةً بمعدّل أقل تكرارًا، مثل كل 60 ثانية. ومع ذلك، قد تتيح معدّلات أخذ العيّنات الأعلى للمستخدمين الاطّلاع على بيانات الصحة واللياقة البدنية بشكل أكثر تفصيلاً ودقة. يجب أن تحقق معدلات أخذ العينات توازنًا بين التفاصيل والأداء.

كتابة البيانات التي يتم تتبُّعها على مدار اليوم

بالنسبة إلى البيانات التي يتم جمعها بشكل مستمر، مثل الخطوات، يجب أن يكتب تطبيقك البيانات إلى Health Connect كل 15 دقيقة على الأقل طوال اليوم.

نوع البيانات

الوحدة

المتوقّع

مثال

الخطوات

الخطوات

كل دقيقة واحدة

‫23:14 - 23:15 - 5 خطوات

‫23:16 - 23:17 - 22 خطوة

‫23:17 - 23:18 - 8 خطوات

StepsCadence

خطوة/دقيقة

كل دقيقة واحدة

‫23:14 - 23:15 - 5 spm

‫23:16 - 23:17 - 22 دورة في الدقيقة

‫23:17 - 23:18 - 8 نبضات في الدقيقة

عدد دفعات الكرسي المتحرك

عمليات الدفع

كل دقيقة واحدة

‫23:14 - 23:15 - 5 إشعارات

‫23:16 - 23:17 - 22 إشعارًا

‫23:17 - 23:18 - 8 إشعارات

ActiveCaloriesBurned

السُعرات الحرارية

كل 15 دقيقة

‫23:15 - 23:30 - سعرتان حراريتان

‫23:30 - 23:45 - 25 سعرة حرارية

‫23:45 - 00:00 - 5 سعرات حرارية

TotalCaloriesBurned

السُعرات الحرارية

كل 15 دقيقة

‫23:15 - 23:30 - 16 سعرة حرارية

‫23:30 - 23:45 - 16 سعرة حرارية

‫23:45 - 00:00 - 16 سعرة حرارية

المسافة

كم/دقيقة

كل دقيقة واحدة

‫23:14-23:15 - 0.008 كم

‫23:16 - 23:16 - 0.021 كم

‫23:17 - 23:18 - 0.012 كم

ElevationGained

m

كل دقيقة واحدة

‫20:36 - 20:37 - 3.048 متر

‫20:39 - 20:40 - 3.048 متر

‫23:23 - 23:24 - 9.144 مليون

FloorsClimbed

طوابق

كل دقيقة واحدة

‫23:14 - 23:15 - 5 طوابق

‫23:16 - 23:16 - 22 طابقًا

‫23:17 - 23:18 - 8 طوابق

HeartRate

نبضة في الدقيقة

4 مرات في الدقيقة

‫6:11:15 صباحًا - 55 نبضة في الدقيقة

‫6:11:30 صباحًا - 56 نبضة في الدقيقة

‫6:11:45 صباحًا - 56 نبضة في الدقيقة

‫6:12:00 صباحًا - 55 نبضة في الدقيقة

HeartRateVariabilityRmssd

ميللي ثانية

كل دقيقة واحدة

‫6:11 صباحًا - 23 ملي ثانية

RespiratoryRate

نفَس في الدقيقة

كل دقيقة واحدة

‫23:14 - 23:15 - 60 نفَسًا في الدقيقة

‫23:16 - 23:16 - 62 نفَسًا في الدقيقة

‫23:17 - 23:18 - 64 نفَسًا في الدقيقة

OxygenSaturation

%

كل ساعة واحدة

‫6:11 - 95.208%

كتابة الجلسات

يجب كتابة البيانات في Health Connect في نهاية التمرين أو جلسة النوم.

يجب أن يلتزم تطبيقك على الأقل بالإرشادات الواردة في عمود المتوقع في الجدول التالي. اتّبِع أفضل الإرشادات حيثما أمكن ذلك.

جلسات التمرين الرياضي والنوم

يوضّح المثال التالي كيفية كتابة البيانات أثناء ممارسة التمارين الرياضية:

نوع البيانات

الوحدة

المتوقّع

مع أطيب التحيات

مثال

الخطوات

الخطوات

كل دقيقة واحدة

كل ثانية واحدة

‫23:14-23:15 - 5 خطوات

‫23:16 - 23:17 - 22 خطوة

‫23:17 - 23:18 - 8 خطوات

StepsCadence

خطوة/دقيقة

كل دقيقة واحدة

كل ثانية واحدة

‫23:14-23:15 - 35 نبضة في الدقيقة

‫23:16 - 23:17 - 37 لقطة في الدقيقة

‫23:17 - 23:18 - 40 نبضة في الدقيقة

عدد دفعات الكرسي المتحرك

عمليات الدفع

كل دقيقة واحدة

كل ثانية واحدة

‫23:14-23:15 - 5 إشعارات

‫23:16 - 23:17 - 22 إشعارًا

‫23:17 - 23:18 - 8 إشعارات

CyclingPedalingCadence

نَفَس/دقيقة

كل دقيقة واحدة

كل ثانية واحدة

‫23:14-23:15 - 65 دورة في الدقيقة

‫23:16 - 23:17 - 70 دورة في الدقيقة

‫23:17 - 23:18 - 68 دورة في الدقيقة

الطاقة

واط

كل دقيقة واحدة

كل ثانية واحدة

‫23:14-23:15 - 250 واط

‫23:16 - 23:17 - 255 واط

‫23:17 - 23:18 - 245 واط

السرعة

كم/دقيقة

كل دقيقة واحدة

كل ثانية واحدة

‫23:14-23:15 - 0.3 كم/دقيقة

‫23:16 - 23:17 - 0.4 كم/دقيقة

‫23:17 - 23:18 -0.4 كلم/دقيقة

المسافة

كلم/دقيقة

كل دقيقة واحدة

كل ثانية واحدة

‫23:14-23:15 - 0.008 كم

‫23:16 - 23:16 - 0.021 كم

‫23:17 - 23:18 - 0.012 كم

ActiveCaloriesBurned

السُعرات الحرارية

كل دقيقة واحدة

كل ثانية واحدة

‫23:14-23:15 - 20 سعرة حرارية

‫23:16 - 23:17 - 20 سعرة حرارية

‫23:17 - 23:18 - 25 سعرة حرارية

TotalCaloriesBurned

السُعرات الحرارية

كل دقيقة واحدة

كل ثانية واحدة

‫23:14-23:15 - 36 سعرة حرارية

‫23:16 - 23:17 - 36 سعرة حرارية

‫23:17 - 23:18 - 41 سعرة حرارية

ElevationGained

m

كل دقيقة واحدة

كل ثانية واحدة

‫20:36 - 20:37 - 3.048 متر

‫20:39 - 20:40 - 3.048 متر

‫23:23 - 23:24 - 9.144 مليون

ExerciseRoutes

lat/lng/alt

كل 3 إلى 5 ثوانٍ

كل ثانية واحدة

HeartRate

نبضة في الدقيقة

4 مرات في الدقيقة

كل ثانية واحدة

‫23:14-23:15 - 150 نبضة في الدقيقة

يوضّح المثال التالي كيفية كتابة البيانات أثناء جلسة نوم أو بعدها:

نوع البيانات

الوحدة

العيّنات المتوقّعة

مثال

تحديد مراحل النوم

المرحلة

فترة زمنية تفصيلية لكل مرحلة من مراحل النوم

‫23:46 - 23:50 - مستيقظ

‫23:50 - 23:56 - نوم خفيف

‫23:56 - 00:16 - نوم عميق

RestingHeartRate

نبضة في الدقيقة

قيمة يومية واحدة (من المتوقّع أن يتم إدخالها في الصباح الباكر)

‫6:11 صباحًا - 60 نبضة في الدقيقة

OxygenSaturation

%

قيمة يومية واحدة (من المتوقّع أن يتم إدخالها في الصباح الباكر)

‫6:11 - 95.208%

فعاليات تضمّ عدّة رياضات

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

يوضّح المثال التالي كيفية كتابة بيانات خاصة بسباق ثلاثي:

val swimStartTime = Instant.parse("2024-08-22T08:00:00Z")
val swimEndTime = Instant.parse("2024-08-22T08:30:00Z")
val bikeStartTime = Instant.parse("2024-08-22T08:40:00Z")
val bikeEndTime = Instant.parse("2024-08-22T09:40:00Z")
val runStartTime = Instant.parse("2024-08-22T09:50:00Z")
val runEndTime = Instant.parse("2024-08-22T10:20:00Z")

val swimSession = ExerciseSessionRecord(
    startTime = swimStartTime,
    endTime = swimEndTime,
    exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_SWIMMING_OPEN_WATER,
    metadata = Metadata.autoRecorded(
      device = Device(type = Device.TYPE_WATCH)
    )
)

val bikeSession = ExerciseSessionRecord(
    startTime = bikeStartTime,
    endTime = bikeEndTime,
    exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_BIKING,
    metadata = Metadata.autoRecorded(
      device = Device(type = Device.TYPE_WATCH)
    )
)

val runSession = ExerciseSessionRecord(
    startTime = runStartTime,
    endTime = runEndTime,
    exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_RUNNING,
    metadata = Metadata.autoRecorded(
      device = Device(type = Device.TYPE_WATCH)
    )
)

healthConnectClient.insertRecords(listOf(swimSession, bikeSession, runSession))