Sessions

Dans Santé Connect, une session correspond à un intervalle de temps pendant lequel un utilisateur effectue une activité. Les types de données SleepSessionRecord et ExerciseSessionRecord sont des sessions.

Les sessions permettent aux utilisateurs de mesurer des performances sur une période donnée, comme la fréquence cardiaque en continu ou des données de localisation.

Les sessions ExerciseSessionRecord incluent diverses activités, de la course à pied au badminton.

Les sessions SleepSessionRecord contiennent des données qui enregistrent les phases du sommeil comme AWAKE, SLEEPING et DEEP.

Les données de sous-type sont des données qui "appartiennent" à une session et ne sont pertinentes que lorsqu'elles sont lues avec une session parente, par exemple une phase de sommeil ou un segment d'exercice.

Les données associées sont des données Record pouvant être lues séparément ou avec d'autres sessions, par exemple le nombre de pas et la fréquence cardiaque.

Conseils généraux

Voici quelques conseils à suivre pour utiliser au mieux les sessions dans Santé Connect.

  • Utilisez les sessions pour ajouter des données concernant un entraînement ou une activité spécifique, ou pour le sommeil :
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
            ),  
        )
    )
}
  • Les sessions ne doivent pas être utilisées pour les mesures générales, telles que le nombre de pas quotidiens.
  • Les données de sous-type ne contiennent pas d'identifiant unique, contrairement aux données associées.
  • Les données de sous-types doivent être alignées dans une session avec des horodatages séquentiels qui ne se chevauchent pas. Les écarts sont toutefois autorisés.
  • Les sessions sont utiles si l'utilisateur souhaite que les données soient associées à une session (et que leur suivi s'effectue en conséquence) au lieu d'être enregistrées de manière continue.

Sessions de sommeil

Vous pouvez lire ou écrire des données sur votre sommeil dans Santé Connect. Les données sur le sommeil s'affichent sous forme de session et peuvent être divisées en huit phases différentes :

  • UNKNOWN : l'état de sommeil de l'utilisateur est inconnu ou non spécifié.
  • AWAKE : l'utilisateur est éveillé dans un cycle de sommeil, pas en journée.
  • SLEEPING : description générique ou non précise du sommeil.
  • OUT_OF_BED : l'utilisateur se lève au milieu d'une session de sommeil.
  • AWAKE_IN_BED : l'utilisateur est éveillé dans son lit.
  • LIGHT : l'utilisateur se trouve dans un cycle de sommeil léger.
  • DEEP : l'utilisateur se trouve dans un cycle de sommeil profond.
  • REM : l'utilisateur se trouve dans un cycle de sommeil paradoxal.

Ces valeurs représentent le type de sommeil d'un utilisateur au cours d'une période donnée. L'écriture des phases de sommeil est facultative, mais recommandée si possible.

Écrire des sessions de sommeil avec ou sans phases de sommeil

Le type de données SleepSessionRecord se compose de deux parties :

  1. La session générale, qui couvre toute la durée du sommeil
  2. Des phases individuelles au cours de la session de sommeil, comme un sommeil léger ou profond

Voici comment insérer une session de sommeil sans phases de sommeil :

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

Voici comment ajouter des phases qui couvrent toute la durée d'une session de sommeil :

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

Lire une session de sommeil

Pour chaque session de sommeil renvoyée, vous devez vérifier si des données sur les phases de sommeil sont également présentes :

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

Supprimer une session de sommeil

Voici comment supprimer une session. Pour cet exemple, nous avons utilisé une session de sommeil :

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

Sessions d'exercice

Les sessions d'exercice peuvent inclure toutes sortes d'activités, de la course à pied au badminton.

Écrire des sessions d'exercice

Voici comment créer une requête d'insertion incluant une session :

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

Notez que, dans l'exemple précédent, un enregistrement est ajouté pour Distance, qui couvre toute la durée de la session, mais les données peuvent être ajoutées avec une précision différente.

Si l'application a mesuré la distance régulièrement pendant la course, une autre approche consisterait à inclure de nombreux enregistrements de distance, chacun représentant la distance parcourue lors d'une partie du parcours.

Lire une session d'exercice

Voici un exemple de lecture d'une session d'exercice :

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

Écrire des données de sous-type

Les sessions peuvent également être constituées de données de sous-type non obligatoires, qui enrichiront la session avec des informations supplémentaires.

Par exemple, les sessions d'exercice peuvent inclure les classes ExerciseSegment, ExerciseLap et 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
)

Supprimer une session d'exercice

Il existe deux façons de supprimer une session d'exercice :

  1. Par période de temps
  2. Par UID

Voici comment supprimer les données de sous-type en fonction d'une période de temps :

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

Vous pouvez également supprimer les données de sous-type par UID. Toutefois, cela ne supprimera que la session d'exercice, pas les données associées :

suspend fun deleteExerciseSession(
    healthConnectClient: HealthConnectClient,
    exerciseRecord: ExerciseSessionRecord,
) {
    healthConnectClient.deleteRecords(
        ExerciseSessionRecord::class,
        recordIdsList = listOf(exerciseRecord.metadata.id),
        clientRecordIdsList = emptyList()
    )
}