Отслеживание сеансов сна

Это руководство совместимо с Health Connect версии 1.1.0-alpha11 .

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"
            ),
        )
    )
}
  • Сеансы не следует использовать для общих измерений, таких как подсчет шагов за день.
  • Данные подтипа не содержат UID, но связанные данные имеют отдельные UID.
  • Данные подтипов должны быть выровнены в сеансе с последовательными временными метками, которые не перекрываются. Однако допускаются пробелы.
  • Сеансы полезны, если пользователь хочет, чтобы данные были связаны с сеансом (и отслеживались как его часть), а не записывались непрерывно.

сеансы сна

Вы можете читать и записывать данные о сне в Health Connect. Данные о сне отображаются в виде сеанса и могут быть разделены на 8 отдельных фаз сна:

  • UNKNOWN : Не указано или неизвестно, спит ли пользователь.
  • AWAKE : Пользователь бодрствует в течение цикла сна, а не в течение дня.
  • SLEEPING : Общее или недетализированное описание сна.
  • OUT_OF_BED : Пользователь встает с постели во время сеанса сна.
  • AWAKE_IN_BED : Пользователь не спит в постели.
  • LIGHT : Пользователь находится в фазе легкого сна.
  • DEEP : Пользователь находится в фазе глубокого сна.
  • 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)
}