Sesi

Di Health Connect, sesi adalah interval waktu saat pengguna melakukan aktivitas. Jenis data SleepSessionRecord dan ExerciseSessionRecord adalah sesi.

Sesi memungkinkan pengguna mengukur performa berdasarkan waktu selama jangka waktu tertentu, seperti detak jantung berkelanjutan atau data lokasi.

Sesi ExerciseSessionRecord mencakup berbagai aktivitas, dari berlari hingga bulu tangkis.

Sesi SleepSessionRecord berisi data yang mencatat tahapan tidur, seperti AWAKE, SLEEPING, dan DEEP.

Data subjenis adalah data yang "termasuk" dalam sesi dan hanya bermanfaat jika dibaca dengan sesi induk, misalnya tahapan tidur, segmen olahraga.

Data terkait adalah data Record yang dapat dibaca secara terpisah atau bersama sesi lainnya, misalnya langkah, detak jantung.

Panduan umum

Berikut adalah beberapa panduan praktik terbaik tentang cara menggunakan sesi di Health Connect.

  • Sesi harus digunakan untuk menambahkan data dari olahraga atau aktivitas tertentu, atau untuk tidur:
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
            ),  
        )
    )
}
  • Sesi tidak boleh digunakan untuk pengukuran umum, seperti jumlah langkah harian.
  • Data subjenis tidak berisi UID, tetapi data terkait memiliki UID yang berbeda.
  • Data subjenis harus disejajarkan dalam sesi dengan stempel waktu berurutan yang tidak tumpang-tindih. Namun, celah diizinkan.
  • Sesi akan berguna jika pengguna menginginkan data dikaitkan dengan (dan dilacak sebagai bagian dari) sesi, bukan dicatat secara terus-menerus.

Sesi tidur

Anda dapat membaca atau menulis data tidur di Health Connect. Data tidur ditampilkan sebagai sesi, dan dapat dibagi menjadi 8 tahapan tidur yang berbeda:

  • UNKNOWN: Tidak ditentukan atau tidak diketahui apakah pengguna sedang tidur.
  • AWAKE: Pengguna terbangun dalam siklus tidur, bukan pada siang hari.
  • SLEEPING: Deskripsi tidur umum atau tidak terperinci.
  • OUT_OF_BED: Pengguna beranjak dari tempat tidur di tengah sesi tidur.
  • AWAKE_IN_BED: Pengguna terbangun di tempat tidur.
  • LIGHT: Pengguna dalam siklus tidur ringan.
  • DEEP: Pengguna berada dalam siklus tidur nyenyak.
  • REM: Pengguna berada dalam siklus tidur REM.

Nilai ini mewakili jenis tidur yang dialami pengguna dalam rentang waktu. Menulis tahapan tidur bersifat opsional, tetapi sebaiknya dilakukan jika tersedia.

Menulis sesi tidur dengan atau tanpa tahapan tidur

Jenis data SleepSessionRecord memiliki dua bagian:

  1. Sesi keseluruhan yang mencakup seluruh durasi tidur.
  2. Masing-masing tahapan selama sesi tidur seperti tidur ringan atau tidur nyenyak.

Berikut ini cara menyisipkan sesi tidur tanpa tahapan:

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

Berikut ini cara menambahkan tahapan yang mencakup seluruh periode sesi tidur:

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

Membaca sesi tidur

Untuk setiap sesi tidur yang ditampilkan, Anda harus memeriksa apakah data tahapan tidur juga ada:

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

Menghapus sesi tidur

Berikut ini cara menghapus sesi. Untuk contoh ini, kita telah menggunakan sesi tidur:

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

Sesi olahraga

Sesi olahraga dapat mencakup apa saja, dari berlari hingga bulu tangkis.

Menulis sesi olahraga

Berikut ini cara mem-build permintaan penyisipan yang menyertakan sesi:

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

Perhatikan cara data ditambahkan untuk Distance pada contoh sebelumnya, yang mencakup seluruh durasi sesi, tetapi data dapat ditambahkan dengan perincian yang berbeda.

Jika aplikasi telah mengukur jarak secara teratur selama berlari, pendekatan lain adalah menyertakan banyak data Jarak, yang masing-masing mewakili jarak yang ditempuh dalam satu sesi lari.

Membaca sesi olahraga

Berikut ini contoh cara membaca sesi olahraga:

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

Menulis data subjenis

Sesi juga dapat terdiri dari data subjenis tidak wajib yang memperkaya sesi dengan informasi tambahan.

Misalnya, sesi olahraga dapat menyertakan class ExerciseSegment, ExerciseLap, dan 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
)

Menghapus sesi olahraga

Ada dua cara untuk menghapus sesi olahraga:

  1. Menurut rentang waktu.
  2. Menurut UID.

Berikut ini cara menghapus data subjenis berdasarkan rentang waktu:

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

Anda juga dapat menghapus data subjenis menurut UID. Namun, melakukan hal tersebut hanya akan menghapus sesi olahraga, bukan data terkait:

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