本指南適用於「健康資料同步」1.1.0-alpha11 版。
健康資料同步提供睡眠階段資料類型,可儲存使用者的睡眠資訊,例如夜間睡眠或午睡。SleepSessionRecord
資料類型用於表示這些工作階段。
使用者可利用時段,在一段時間內依據時間來評估成效,例如連續心率或位置資料。
SleepSessionRecord
時段包含記錄睡眠階段的資料,例如 AWAKE
、SLEEPING
和 DEEP
。
子類型資料是「屬於」時段的資料,而且只在與父項時段一併讀取時才有意義。例如睡眠階段。
功能適用情況
這個資料類型沒有功能可用性旗標。
所需權限
存取睡眠記錄時,系統會要求下列權限:
android.permission.health.READ_SLEEP
android.permission.health.WRITE_SLEEP
在 Play 管理中心和應用程式資訊清單中,為應用程式聲明這些權限:
<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"
),
)
)
}
- 時段不應用於一般測量項目,例如每日步數。
- 子類型資料不包含 UID,但關聯資料具有不同的 UID。
- 子類型資料必須符合時段中不重疊的序列時間戳記,不過可以出現間隔。
- 如果使用者想將資料與時段建立關聯 並以時段的形式加以追蹤,而非持續記錄資料,這時就適合使用時段。
睡眠記錄
您可以在「健康資料同步」中讀取或寫入睡眠資料。睡眠資料會顯示為時段,並且可分為 8 個不同的睡眠階段:
UNKNOWN
:未指定或不知道使用者是否入睡。AWAKE
:使用者在睡眠週期內 (而非日間) 醒來。SLEEPING
:一般或不精細的睡眠描述。OUT_OF_BED
:使用者在睡眠時段中離開床鋪。AWAKE_IN_BED
:使用者在床上醒來。LIGHT
:使用者處於淺眠週期。DEEP
:使用者處於深層睡眠週期。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)
}