الجلسة في Health Connect هي فاصل زمني يُجري المستخدم خلاله
الأخرى. نوعا البيانات SleepSessionRecord
وExerciseSessionRecord
هما كلاهما
الجلسات.
تتيح الجلسات للمستخدمين قياس الأداء المستند إلى الوقت خلال فترة زمنية، مثل بيانات الموقع أو معدّل نبضات القلب المستمر
تتضمن ExerciseSessionRecord
جلسات مجموعة متنوعة من الأنشطة، بدءًا من الجري.
إلى كرة الريشة.
تحتوي SleepSessionRecord
جلسة على بيانات تسجِّل مراحل النوم، مثل.
AWAKE
وSLEEPING
وDEEP
بيانات النوع الفرعي هي البيانات التي "تنتمي" إلى جلسة ويكون له مغزى فقط عندما تتم قراءته مع جلسة رئيسية، على سبيل المثال ومرحلة النوم، جزء التمرين.
البيانات المرتبطة، هي Record
يمكن قراءتها بشكل منفصل أو إلى جانب بيانات أخرى
الجلسات، مثل الخطوات، معدل ضربات القلب.
إرشادات عامة
في ما يلي بعض الإرشادات حول أفضل الممارسات حول كيفية التعامل مع الجلسات في Health اتصال.
- يجب استخدام الجلسات لإضافة بيانات من تمرين أو نشاط محدّدين، أو للنوم:
suspend fun writeExerciseSession(healthConnectClient: HealthConnectClient) {
healthConnectClient.insertRecords(
listOf(
ExerciseSessionRecord(
startTime = Instant.parse("2022-05-10T10:00:00.000Z"),
startZoneOffset = ZoneOffset.of("-08:00"),
endTime = Instant.parse("2022-05-10T11:00:00.000Z"),
endZoneOffset = ZoneOffset.of("-08:00"),
exerciseType = ExerciseSessionRecord.ExerciseType.WALKING,
title = "My Walk"
),
StepsRecord(
startTime = Instant.parse("2022-05-10T10:00:00.000Z"),
startZoneOffset = ZoneOffset.of("-08:00"),
endTime = Instant.parse("2022-05-10T10:30:00.000Z"),
endZoneOffset = ZoneOffset.of("-08:00"),
count = 2800
),
StepsRecord(
startTime = Instant.parse("2022-05-10T10:30:00.000Z"),
startZoneOffset = ZoneOffset.of("-08:00"),
endTime = Instant.parse("2022-05-10T11:00:00.000Z"),
endZoneOffset = ZoneOffset.of("-08:00"),
count = 3200
),
)
)
}
- يجب عدم استخدام الجلسات للقياسات العامة، مثل الخطوات اليومية. العدد.
- لا تحتوي بيانات النوع الفرعي على معرّف فريد، ولكن البيانات المرتبطة لها معرّفات فريدة خاصة.
- يجب محاذاة بيانات الأنواع الفرعية في جلسة باستخدام الطوابع الزمنية التسلسلية. لا تتداخل. ومع ذلك، يُسمح بالفجوات.
- تكون الجلسات مفيدة إذا أراد المستخدم ربط البيانات به (و كجزء من) جلسة، وليس تسجيلها بشكل مستمر.
جلسات النوم
يمكنك قراءة بيانات النوم أو كتابتها في Health Connect. يتم عرض بيانات النوم على شكل ويمكن تقسيمها إلى 8 مراحل نوم مختلفة:
UNKNOWN
: غير محدّد أو غير معروف إذا كان المستخدم نائمًاAWAKE
: يكون المستخدم مستيقظًا خلال دورة النوم، وليس خلال النهار.SLEEPING
: وصف النوم العام أو غير الدقيقOUT_OF_BED
: يقفز المستخدم من السرير في منتصف جلسة النوم.AWAKE_IN_BED
: يكون المستخدم مستيقظًا في السرير.LIGHT
: المستخدم في دورة نوم خفيفة.DEEP
: المستخدم في دورة نوم عميق.REM
: المستخدم في دورة نوم حركة العين السريعة REM.
تمثل هذه القيم نوع النوم الذي يمر به المستخدم خلال نطاق زمني. كتابة مراحل النوم اختيارية، ولكن يُنصح باستخدامها إن توفّرت.
كتابة جلسات النوم مع مراحل نوم أو بدونها
يتألف نوع البيانات SleepSessionRecord
من جزأين:
- الجلسة الكلية، التي تغطي مدة النوم بالكامل.
- المراحل الفردية أثناء جلسة النوم، مثل النوم الخفيف أو العمق نوم
في ما يلي طريقة إدراج جلسة نوم بدون مراحل:
SleepSessionRecord(
title = "weekend sleep",
startTime = startTime,
endTime = endTime,
startZoneOffset = ZoneOffset.UTC,
endZoneOffset = ZoneOffset.UTC,
)
إليك طريقة إضافة المراحل التي تغطي الفترة الكاملة لجلسة النوم:
val stages = listOf(
SleepSessionRecord.Stage(
startTime = START_TIME
endTime = END_TIME,
stage = SleepSessionRecord.STAGE_TYPE_SLEEPING,
)
)
SleepSessionRecord(
title = "weekend sleep",
startTime = START_TIME,
endTime = END_TIME,
startZoneOffset = START_ZONE_OFFSET,
endZoneOffset = END_ZONE_OFFSET,
stages = stages,
)
}
قراءة جلسة نوم
بالنسبة إلى كل جلسة نوم تتم إعادتها، يجب التحقق مما إذا كانت بيانات مرحلة النوم يضم أيضًا:
suspend fun readSleepSessions(
healthConnectClient: HealthConnectClient,
startTime: Instant,
endTime: Instant
) {
val response =
healthConnectClient.readRecords(
ReadRecordsRequest(
SleepSessionRecord::class,
timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
)
)
for (sleepRecord in response.records) {
// Retrieve relevant sleep stages from each sleep record
val sleepStages = sleepRecord.stages
}
}
حذف جلسة النوم
هذه هي طريقة حذف جلسة. في هذا المثال، استخدمنا جلسة نوم:
suspend fun deleteSleepSession(
healthConnectClient: HealthConnectClient,
sleepRecord: SleepSessionRecord,
) {
val timeRangeFilter = TimeRangeFilter.between(sleepRecord.startTime, sleepRecord.endTime)
healthConnectClient.deleteRecords(SleepSessionRecord::class, timeRangeFilter)
}
جلسات التمرين
يمكن أن تشمل جلسات التمرين أي شيء بدءًا من الركض إلى تنس الريشة.
كتابة بيانات جلسات التمرين
في ما يلي طريقة إنشاء طلب إدراج يتضمّن جلسة:
suspend fun writeExerciseSession(healthConnectClient: HealthConnectClient) {
healthConnectClient.insertRecords(
listOf(
ExerciseSessionRecord(
startTime = START_TIME,
startZoneOffset = START_ZONE_OFFSET,
endTime = END_TIME,
endZoneOffset = END_ZONE_OFFSET,
exerciseType = ExerciseSessionRecord.ExerciseType.RUNNING,
title = "My Run"
),
DistanceRecord(
startTime = START_TIME,
startZoneOffset = START_ZONE_OFFSET,
endTime = END_TIME,
endZoneOffset = END_ZONE_OFFSET,
distance = 5000.meters
),
// ... other records
)
)
}
لاحظ كيف تتم إضافة سجل لـ Distance
، في المثال السابق، يمتد
مدة الجلسة بالكامل، ولكن يمكن إضافة بيانات
ودقتها.
إذا كان التطبيق يقيس المسافة بانتظام أثناء الجري، سيتم استخدام طريقة أخرى الكثير من سجلات المسافة، ويمثل كل منها المسافة في جزء من التشغيل.
قراءة جلسة تمرين
إليك مثال على كيفية قراءة جلسة تمرين:
suspend fun readExerciseSessions(
healthConnectClient: HealthConnectClient,
startTime: Instant,
endTime: Instant
) {
val response =
healthConnectClient.readRecords(
ReadRecordsRequest(
ExerciseSessionRecord::class,
timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
)
)
for (exerciseRecord in response.records) {
// Process each exercise record
// Optionally pull in with other data sources of the same time range.
val distanceRecord =
healthConnectClient
.readRecords(
ReadRecordsRequest(
DistanceRecord::class,
timeRangeFilter =
TimeRangeFilter.between(
exerciseRecord.startTime,
exerciseRecord.endTime
)
)
)
.records
}
}
كتابة بيانات النوع الفرعي
كما يمكن أن تتكون الجلسات من بيانات من النوع الفرعي غير الإلزامي، والتي تثري جلسة مع معلومات إضافية.
على سبيل المثال، يمكن أن تشمل جلسات التمارين الرياضية ExerciseSegment
وExerciseLap
.
وExerciseRoute
صفًا:
val segments = listOf(
ExerciseSegment(
startTime = Instant.parse("2022-01-02T10:10:10Z"),
endTime = Instant.parse("2022-01-02T10:10:13Z"),
segmentType = ActivitySegmentType.BENCH_PRESS,
repetitions = 373
)
)
val laps = listOf(
ExerciseLap(
startTime = Instant.parse("2022-01-02T10:10:10Z"),
endTime = Instant.parse("2022-01-02T10:10:13Z"),
length = 0.meters
)
)
ExerciseSessionRecord(
exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_CALISTHENICS,
startTime = Instant.parse("2022-01-02T10:10:10Z"),
endTime = Instant.parse("2022-01-02T10:10:13Z"),
startZoneOffset = ZoneOffset.UTC,
endZoneOffset = ZoneOffset.UTC,
segments = segments,
laps = laps,
route = route
)
حذف جلسة تمرين
هناك طريقتان لحذف جلسة تمرين:
- حسب النطاق الزمني.
- باستخدام UID.
وفي ما يلي كيفية حذف بيانات النوع الفرعي وفقًا للنطاق الزمني:
suspend fun deleteExerciseSession(
healthConnectClient: HealthConnectClient,
exerciseRecord: ExerciseSessionRecord,
) {
val timeRangeFilter = TimeRangeFilter.between(sleepRecord.startTime, sleepRecord.endTime)
healthConnectClient.deleteRecords(SleepSessionRecord::class, timeRangeFilter)
// delete the associated distance record
healthConnectClient.deleteRecords(DistanceRecord::class, timeRangeFilter)
}
يمكنك أيضًا حذف بيانات النوع الفرعي باستخدام المعرّف الفريد. ومع ذلك، سيؤدي هذا الأمر إلى حذف ملف جلسة التمرين، وليست البيانات المرتبطة بها:
suspend fun deleteExerciseSession(
healthConnectClient: HealthConnectClient,
exerciseRecord: ExerciseSessionRecord,
) {
healthConnectClient.deleteRecords(
ExerciseSessionRecord::class,
recordIdsList = listOf(exerciseRecord.metadata.id),
clientRecordIdsList = emptyList()
)
}