ב-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
),
)
)
}
- אין להשתמש בסשנים לצורך מדידה כללית, כמו שלב יומי. סופרים.
- הנתונים של סוגי המשנה לא מכילים 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()
)
}