در Health Connect یک جلسه یک بازه زمانی است که در طی آن کاربر یک فعالیت را انجام می دهد. انواع داده SleepSessionRecord
و ExerciseSessionRecord
هر دو جلسه هستند.
Sessions به کاربران این امکان را می دهد که عملکرد مبتنی بر زمان را در یک دوره زمانی اندازه گیری کنند، مانند ضربان قلب مداوم یا داده های مکان.
جلسات ExerciseSessionRecord
شامل انواع فعالیت ها، از دویدن گرفته تا بدمینتون است.
جلسات SleepSessionRecord
حاوی دادههایی هستند که مراحل خواب را ثبت میکنند، مانند AWAKE
، SLEEPING
و DEEP
.
دادههای زیرمجموعه ، دادههایی هستند که به یک جلسه «تعلق دارند» و تنها زمانی معنادار میشوند که با یک جلسه والدین خوانده شوند، مثلاً مرحله خواب، بخش تمرین.
داده های مرتبط ، این است که داده های Record
را می توان به طور جداگانه یا در کنار سایر جلسات خواند، به عنوان مثال مراحل، ضربان قلب.
راهنمایی کلی
در اینجا برخی از بهترین دستورالعمل ها در مورد نحوه کار با جلسات در Health Connect آورده شده است.
- جلسات باید برای افزودن دادههای یک تمرین یا فعالیت خاص یا برای خواب استفاده شوند:
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
),
)
)
}
- جلسات نباید برای اندازه گیری های عمومی مانند شمارش گام های روزانه استفاده شوند.
- دادههای نوع فرعی حاوی یک UID نیستند، اما دادههای مرتبط دارای UIDهای متمایز هستند.
- دادههای نوع فرعی باید در یک جلسه با مهرهای زمانی متوالی که همپوشانی ندارند، تراز شوند. با این حال، شکاف ها مجاز هستند.
- جلسات زمانی مفید هستند که کاربر بخواهد به جای ضبط مداوم، داده ها با یک جلسه مرتبط شوند (و به عنوان بخشی از آن ردیابی شوند).
جلسات خواب
میتوانید دادههای خواب را در 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)
}
همچنین می توانید داده های زیرنوع را با استفاده از UID حذف کنید. با این حال، انجام این کار، فقط جلسه تمرین را حذف می کند، نه داده های مرتبط:
suspend fun deleteExerciseSession(
healthConnectClient: HealthConnectClient,
exerciseRecord: ExerciseSessionRecord,
) {
healthConnectClient.deleteRecords(
ExerciseSessionRecord::class,
recordIdsList = listOf(exerciseRecord.metadata.id),
clientRecordIdsList = emptyList()
)
}