Monitorare le sessioni di sonno

Questa guida è compatibile con la versione 1.1.0-alpha11 di Connessione Salute.

Connessione Salute fornisce un tipo di dati sessione di sonno per memorizzare informazioni sul sonno di un utente, ad esempio una sessione notturna o un pisolino diurno. Per rappresentare queste sessioni viene utilizzato il tipo di dati SleepSessionRecord.

Le sessioni consentono agli utenti di misurare le prestazioni in base al tempo in un determinato periodo, ad esempio la frequenza cardiaca continua o i dati sulla posizione.

Le sessioni SleepSessionRecord contengono dati che registrano le fasi del sonno, ad esempio AWAKE, SLEEPING e DEEP.

I dati Sottotipo sono dati "appartenenti" a una sessione e sono significativi solo se vengono letti con una sessione principale. Ad esempio, la fase del sonno.

Disponibilità della funzionalità

Non esiste un flag di disponibilità delle funzionalità per questo tipo di dati.

Autorizzazioni richieste

L'accesso alle sessioni di sonno è protetto dalle seguenti autorizzazioni:

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

Dichiara queste autorizzazioni in Play Console per la tua app, nonché nel manifest dell'app:

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

Sei responsabile della dichiarazione di tutte le autorizzazioni appropriate che intendi utilizzare nei tuoi dispositivi e nelle tue app. Devi anche verificare che ogni autorizzazione sia stata concessa dall'utente prima dell'utilizzo.

Indicazioni generali

Ecco alcune linee guida sulle best practice per lavorare con le sessioni di sonno in Health Connect.

  • Le sessioni devono essere utilizzate per aggiungere dati da una sessione di sonno specifica, per il sonno:
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"
            ),
        )
    )
}
  • Le sessioni non devono essere utilizzate per misurazioni generali, come il conteggio dei passi giornalieri.
  • I dati del sottotipo non contengono un UID, ma i dati associati hanno UID distinti.
  • I dati del sottotipo devono essere allineati in una sessione con timestamp sequenziali che non si sovrappongono. Tuttavia, sono consentiti spazi vuoti.
  • Le sessioni sono utili se l'utente vuole che i dati siano associati a una sessione (e monitorati come parte di una sessione), anziché registrati in modo continuo.

Sessioni di sonno

Puoi leggere o scrivere dati sul sonno in Connessione Salute. I dati sul sonno vengono visualizzati come sessione e possono essere suddivisi in 8 fasi del sonno distinte:

  • UNKNOWN: Non specificato o sconosciuto se l'utente sta dormendo.
  • AWAKE: l'utente è sveglio durante un ciclo del sonno, non durante il giorno.
  • SLEEPING: Descrizione del sonno generica o non granulare.
  • OUT_OF_BED: l'utente si alza dal letto nel bel mezzo di una sessione di sonno.
  • AWAKE_IN_BED: L'utente è sveglio a letto.
  • LIGHT: l'utente si trova in un ciclo di sonno leggero.
  • DEEP: l'utente si trova in un ciclo di sonno profondo.
  • REM: l'utente si trova in un ciclo di sonno REM.

Questi valori rappresentano il tipo di sonno che un utente sperimenta in un intervallo di tempo. La scrittura delle fasi del sonno è facoltativa, ma consigliata se disponibile.

Scrittura delle sessioni di sonno

Il tipo di dati SleepSessionRecord è composto da due parti:

  1. La sessione complessiva, che copre l'intera durata del sonno.
  2. Singole fasi durante la sessione di sonno, come il sonno leggero o profondo.

Ecco come inserire una sessione di sonno senza fasi:

SleepSessionRecord(
      title = "weekend sleep",
      startTime = startTime,
      endTime = endTime,
      startZoneOffset = ZoneOffset.UTC,
      endZoneOffset = ZoneOffset.UTC,
)

Ecco come aggiungere fasi che coprono l'intero periodo di una sessione di sonno:

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

Lettura di una sessione di sonno

Per ogni sessione di sonno restituita, devi verificare se sono presenti anche i dati sulle fasi del sonno:

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

Eliminare una sessione di sonno

Ecco come eliminare una sessione. Per questo esempio, abbiamo utilizzato una sessione di sonno:

suspend fun deleteSleepSession(
    healthConnectClient: HealthConnectClient,
    sleepRecord: SleepSessionRecord,
) {
    val timeRangeFilter = TimeRangeFilter.between(sleepRecord.startTime, sleepRecord.endTime)
    healthConnectClient.deleteRecords(SleepSessionRecord::class, timeRangeFilter)
}