Sesiones

En Health Connect, una sesión es un intervalo de tiempo durante el cual un usuario realiza una actividad. Los tipos de datos SleepSessionRecord y ExerciseSessionRecord son sesiones.

Las sesiones permiten que los usuarios midan el rendimiento basado en el tiempo durante un período, como la frecuencia cardíaca continua o los datos de ubicación.

Las sesiones de ExerciseSessionRecord incluyen una variedad de actividades, desde correr hasta jugar bádminton.

Las sesiones SleepSessionRecord contienen datos que registran las etapas del sueño, como AWAKE, SLEEPING y DEEP.

Los datos de subtipo son aquellos que "pertenecen" a una sesión y solo son significativos cuando se leen con una sesión superior, p. ej., una fase del sueño o un segmento de ejercicio.

Los datos asociados son aquellos de Record que se pueden leer por separado o junto con otras sesiones, p. ej., los pasos o la frecuencia cardíaca.

Guía general

Estos son algunos lineamientos de las prácticas recomendadas para trabajar con sesiones en Health Connect.

  • Debes usar sesiones para agregar datos de un entrenamiento o una actividad específicos, o bien para dormir:
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
            ),  
        )
    )
}
  • Las sesiones no deben usarse para mediciones generales, como los recuentos de pasos diarios.
  • Los datos de subtipo no contienen un UID, pero los datos asociados tienen UID distintos.
  • Los datos de subtipo deben alinearse en una sesión con marcas de tiempo secuenciales que no se superpongan. Sin embargo, se permiten vacíos.
  • Las sesiones son útiles si el usuario desea que los datos se asocien con una sesión, y que se haga un seguimiento de ellos como parte de ella, en lugar de grabarla de forma continua.

Sesiones de sueño

Puedes leer o escribir datos de sueño en Health Connect. Los datos de sueño se muestran como una sesión y se pueden dividir en 8 fases del sueño distintas:

  • UNKNOWN: No se especifica o se desconoce si el usuario está durmiendo.
  • AWAKE: El usuario está despierto en un ciclo de sueño, no durante el día.
  • SLEEPING: Descripción del sueño genérica o no detallada.
  • OUT_OF_BED: El usuario se levanta de la cama en medio de una sesión de sueño.
  • AWAKE_IN_BED: El usuario está despierto en la cama.
  • LIGHT: El usuario se encuentra en un ciclo de sueño ligero.
  • DEEP: El usuario se encuentra en un ciclo de sueño profundo.
  • REM: El usuario se encuentra en un ciclo de sueño REM.

Estos valores representan el tipo de sueño que experimenta un usuario durante un intervalo de tiempo. La escritura sobre fases del sueño es opcional, pero te recomendamos que lo hagas si está disponible.

Cómo escribir sesiones de sueño con fases del sueño o sin ellas

El tipo de datos SleepSessionRecord tiene dos partes:

  1. La sesión general, que abarca toda la duración del sueño
  2. Fases individuales durante la sesión de sueño, como el sueño ligero o el sueño profundo

A continuación, te mostramos cómo insertar una sesión de sueño sin fases:

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

Sigue estos pasos para agregar fases que abarquen todo el período de una sesión de sueño:

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

Cómo leer una sesión de sueño

En cada sesión de sueño que se muestra, debes comprobar si también hay datos disponibles de la fase del sueño:

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

Cómo borrar una sesión de sueño

Así es como se borra una sesión. En este ejemplo, usamos una sesión de sueño:

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

Sesiones de ejercicio

Las sesiones de ejercicio pueden incluir cualquier actividad, desde correr hasta jugar bádminton.

Cómo escribir sesiones de ejercicio

A continuación, se muestra cómo compilar una solicitud de inserción que incluya una sesión:

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

Observa el modo en que en el ejemplo anterior se agrega un registro para Distance, que abarca la duración completa de la sesión, pero los datos se pueden agregar con un nivel de detalle diferente.

Si la app midió la distancia con frecuencia durante el entrenamiento, otro enfoque sería incluir muchos registros de Distance, cada uno de los cuales representa la distancia recorrida en una parte de la carrera.

Cómo leer una sesión de ejercicio

Este es un ejemplo de cómo leer una sesión de ejercicio:

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

Cómo escribir datos de subtipos

Las sesiones también pueden estar compuestas por datos de subtipo no obligatorios, que enriquecen la sesión con información adicional.

Por ejemplo, las sesiones de ejercicio pueden incluir las clases ExerciseSegment, ExerciseLap y 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
)

Cómo borrar una sesión de ejercicio

Existen dos maneras de borrar una sesión de ejercicio:

  1. Por intervalo de tiempo
  2. Por UID

A continuación, te mostramos cómo borrar los datos de subtipo según el intervalo de tiempo:

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

También puedes borrar datos de subtipo por UID. Sin embargo, esto solo borrará la sesión de ejercicio, no los datos asociados:

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