מעקב אחר נתוני שינה

המדריך הזה תואם לגרסה 1.1.0-alpha11 של Health Connect.

אפליקציית Health Connect מספקת סוג נתונים של סשן שינה, כדי לאחסן מידע על השינה של המשתמש, כמו סשן לילי או תנומה במהלך היום. סוג הנתונים SleepSessionRecord משמש לייצוג של הסשנים האלה.

הסשנים מאפשרים למשתמשים למדוד את הביצועים לפי זמן לאורך תקופה מסוימת, כמו נתונים רציפים של קצב הלב או המיקום.

סשנים של SleepSessionRecord מכילים נתונים שמתעדים את שלבי השינה, כמו AWAKE, SLEEPING ו-DEEP.

נתוני סוג משנה הם נתונים ש"שייכים" לסשן, והם משמעותיים רק כשקוראים אותם עם סשן אב. לדוגמה, שלב השינה.

זמינות התכונות

אין דגל זמינות של תכונות לסוג הנתונים הזה.

הרשאות נדרשות

הגישה לסשנים של שינה מוגנת על ידי ההרשאות הבאות:

  • android.permission.health.READ_SLEEP
  • android.permission.health.WRITE_SLEEP

צריך להצהיר על ההרשאות האלה ב-Play Console עבור האפליקציה, וגם בקובץ המניפסט של האפליקציה:

<application>
  <uses-permission
android:name="android.permission.health.READ_SLEEP" />
  <uses-permission
android:name="android.permission.health.WRITE_SLEEP" />
...
</application>

באחריותכם להצהיר על כל ההרשאות המתאימות שאתם מתכוונים להשתמש בהן במכשירים ובאפליקציות שלכם. כדאי גם לבדוק שלכל הרשאה יש אישור מהמשתמש לפני השימוש בה

הנחיות כלליות

ריכזנו כאן כמה שיטות מומלצות לשימוש בנתוני שינה ב-Health Connect.

  • צריך להשתמש בסשנים כדי להוסיף נתונים מסשן שינה ספציפי, לשינה:
suspend fun writeSleepSession(healthConnectClient: HealthConnectClient) {
    healthConnectClient.insertRecords(
        listOf(
            SleepSessionRecord(
                startTime = Instant.parse("2022-05-10T23:00:00.000Z"),
                startZoneOffset = ZoneOffset.of("-08:00"),
                endTime = Instant.parse("2022-05-11T07:00:00.000Z"),
                endZoneOffset = ZoneOffset.of("-08:00"),
                title = "My Sleep"
            ),
        )
    )
}
  • אין להשתמש בסשנים למדידות כלליות, כמו מספר הצעדים היומי.
  • נתוני סוג המשנה לא מכילים מזהה ייחודי, אבל לנתונים המשויכים יש מזהים ייחודיים שונים.
  • הנתונים של סוג המשנה צריכים להיות מיושרים בסשן עם חותמות זמן עוקבות שלא חופפות. אפשר להשתמש ברווחים.
  • הסשנים שימושיים אם המשתמש רוצה שהנתונים ישויכו לסשן (ויתועדו כחלק ממנו), ולא יתועדו באופן רציף.

רשומות שינה

אתם יכולים לקרוא או לכתוב נתוני שינה ב-Health Connect. נתוני השינה מוצגים כסשן, ואפשר לחלק אותם ל-8 שלבים שונים של שינה:

  • UNKNOWN: לא צוין או לא ידוע אם המשתמש ישן.
  • AWAKE: המשתמש ער במהלך מחזור שינה, לא במהלך היום.
  • SLEEPING: תיאור שינה גנרי או לא מפורט.
  • OUT_OF_BED: המשתמש קם מהמיטה באמצע סשן שינה.
  • AWAKE_IN_BED: המשתמש ער במיטה.
  • LIGHT: המשתמש נמצא במחזור שינה קל.
  • DEEP: המשתמש נמצא במצב שינה עמוקה.
  • REM: המשתמש נמצא במחזור שינה של REM.

הערכים האלה מייצגים את סוג השינה שהמשתמש חווה בטווח זמן מסוים. הוספת נתוני שלבי השינה היא אופציונלית, אבל מומלצת אם היא זמינה.

כתיבת נתוני השינה

סוג הנתונים SleepSessionRecord כולל שני חלקים:

  1. הסשן הכולל, שמתפרס על כל משך השינה.
  2. שלבים בודדים במהלך סשן השינה, כמו שינה קלה או שינה עמוקה.

כך מוסיפים סשן שינה בלי שלבים:

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