เซสชัน

ใน Health Connect เซสชันคือช่วงเวลาระหว่างที่ผู้ใช้ดําเนินการ กิจกรรม ประเภทข้อมูลของ SleepSessionRecord และ ExerciseSessionRecord เป็นทั้ง 2 ประเภท เซสชัน

เซสชันช่วยให้ผู้ใช้สามารถวัดประสิทธิภาพที่อิงตามช่วงเวลา เช่น อัตราการเต้นของหัวใจแบบต่อเนื่อง หรือข้อมูลตำแหน่ง

ExerciseSessionRecord เซสชันมีกิจกรรมที่หลากหลาย ตั้งแต่การวิ่ง สำหรับกีฬาแบดมินตัน

SleepSessionRecord เซสชันมีข้อมูลที่บันทึกระยะการนอนหลับ เช่น AWAKE, SLEEPING และ DEEP

ข้อมูลประเภทย่อยคือข้อมูลที่ "เป็น" เซสชันและมีความหมายก็ต่อเมื่อ อ่านพร้อมกับเซสชันของผู้ปกครอง เช่น ระยะการนอนหลับ ช่วงการออกกำลังกาย

ข้อมูลที่เชื่อมโยง เป็นข้อมูลRecord อ่านแยกต่างหากหรือควบคู่กับข้อมูลอื่นๆ ได้ เซสชัน เช่น จำนวนก้าว อัตราการเต้นของหัวใจ

คําแนะนําทั่วไป

ต่อไปนี้เป็นหลักเกณฑ์แนวทางปฏิบัติแนะนำเกี่ยวกับวิธีทำงานกับเซสชันใน Health Connect

  • ควรใช้เซสชันเพื่อเพิ่มข้อมูลจากการออกกำลังกายหรือกิจกรรมที่เฉพาะเจาะจง หรือ สำหรับการนอนหลับ:
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
            ),  
        )
    )
}
  • ไม่ควรใช้เซสชันสำหรับการวัดผลทั่วไป เช่น จำนวนก้าวในแต่ละวัน ได้
  • ข้อมูลประเภทย่อยไม่มี UID แต่ข้อมูลที่เชื่อมโยงจะมี UID ต่างกัน
  • ข้อมูลประเภทย่อยจำเป็นต้องจัดเรียงในเซสชันที่มีการประทับเวลาตามลำดับ ที่ไม่ซ้อนทับกัน อย่างไรก็ตาม สามารถมีช่องว่างได้
  • เซสชันจะมีประโยชน์หากผู้ใช้ต้องการเชื่อมโยงกับข้อมูล (และ ติดตามเป็นส่วนหนึ่งของ) เซสชัน แทนที่จะบันทึกอย่างต่อเนื่อง

เซสชันการนอนหลับ

คุณอ่านหรือเขียนข้อมูลการนอนหลับได้ใน Health Connect ข้อมูลการนอนหลับจะแสดงเป็น และแบ่งออกเป็น 8 ระยะที่แตกต่างกัน ดังนี้

  • UNKNOWN: ไม่ระบุหรือไม่ทราบว่าผู้ใช้นอนหลับอยู่หรือไม่
  • AWAKE: ผู้ใช้ตื่นอยู่ในวงจรการนอนหลับ ไม่ใช่ระหว่างวัน
  • SLEEPING: คำอธิบายการนอนหลับทั่วไปหรือแบบละเอียด
  • OUT_OF_BED: ผู้ใช้ลุกจากเตียงในระหว่างเซสชันการนอนหลับ
  • AWAKE_IN_BED: ผู้ใช้ตื่นอยู่บนเตียง
  • LIGHT: ผู้ใช้อยู่ในวงจรการนอนหลับแบบเบา
  • DEEP: ผู้ใช้อยู่ในวงจรการหลับลึก
  • REM: ผู้ใช้อยู่ในวงจรการนอนหลับแบบ REM

ค่าเหล่านี้แสดงประเภทการนอนหลับที่ผู้ใช้ได้รับภายในช่วงระยะเวลา ไม่จำเป็นต้องเขียนระยะการนอนหลับ แต่แนะนำให้ใช้หากมี

เขียนข้อมูลเซสชันการนอนหลับที่มีหรือไม่มีระยะการนอนหลับ

ประเภทข้อมูล SleepSessionRecord มี 2 ส่วนดังนี้

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

เซสชันการออกกำลังกาย

เซสชันการออกกำลังกายอาจเป็นอะไรก็ได้ ตั้งแต่การวิ่งไปจนถึงแบดมินตัน

เขียนข้อมูลเซสชันการออกกำลังกาย

วิธีสร้างคำขอการแทรกที่มีเซสชันมีดังต่อไปนี้

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

ดูว่าในตัวอย่างก่อนหน้านี้ มีการเพิ่มระเบียนสำหรับ Distance อย่างไร ซึ่งครอบคลุม ตลอดระยะเวลาของเซสชัน แต่สามารถเพิ่มข้อมูลด้วย รายละเอียด

หากแอปวัดระยะทางเป็นประจําระหว่างการวิ่ง ก็ให้ใช้วิธีอื่น จะต้องรวมบันทึกระยะทางจำนวนมาก แต่ละรายการแทนระยะทาง ที่ครอบคลุมในส่วนหนึ่งของการวิ่ง

อ่านเซสชันการออกกำลังกาย

ต่อไปนี้เป็นตัวอย่างวิธีการอ่านเซสชันการออกกำลังกาย

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

เขียนข้อมูลประเภทย่อย

เซสชันยังอาจประกอบด้วยข้อมูลประเภทย่อยที่ไม่จำเป็น ซึ่งจะช่วยเสริม เซสชันที่มีข้อมูลเพิ่มเติม

ตัวอย่างเช่น เซสชันการออกกำลังกายอาจรวม ExerciseSegment, ExerciseLap และ 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
)

ลบเซสชันการออกกำลังกาย

คุณลบเซสชันการออกกำลังกายได้ 2 วิธีดังนี้

  1. ตามช่วงเวลา
  2. โดย UID

ต่อไปนี้คือวิธีลบข้อมูลประเภทย่อยตามช่วงเวลา

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

นอกจากนี้คุณยังลบข้อมูลประเภทย่อยตาม UID ได้ด้วย แต่การดำเนินการนี้จะลบเฉพาะ เซสชันการออกกำลังกาย ไม่ใช่ข้อมูลที่เกี่ยวข้อง

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