Oturumlar

Health Connect'te oturum, kullanıcının bir etkinlik gerçekleştirdiği zaman aralığıdır. SleepSessionRecord ve ExerciseSessionRecord veri türlerinin ikisi de oturumdur.

Oturumlar, kullanıcıların sürekli nabız veya konum verileri gibi belirli bir süre boyunca zamana dayalı performansı ölçmesine olanak tanır.

ExerciseSessionRecord seansları koşmadan badmintona kadar çeşitli aktiviteler içerir.

SleepSessionRecord oturumlarında AWAKE, SLEEPING ve DEEP gibi uyku aşamalarını kaydeden veriler yer alır.

Alt tür verileri, bir oturuma "ait" olan verilerdir ve yalnızca bir ebeveyn oturumuyla (ör. uyku aşaması, egzersiz segmenti) okunduğunda anlamlı olur.

İlişkili veriler, Record verilerinin ayrı olarak veya diğer oturumlarla (ör. adım sayısı, nabız) birlikte okunabilmesidir.

Genel kurallar

Health Connect'teki oturumlarla çalışmayla ilgili en iyi uygulamalardan bazılarını aşağıda bulabilirsiniz.

  • Oturumlar, belirli bir antrenman veya aktiviteden veri eklemek ya da uyku için kullanılmalıdır:
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
            ),  
        )
    )
}
  • Oturumlar, günlük adım sayısı gibi genel ölçümler için kullanılmamalıdır.
  • Alt tür verileri UID içermez, ancak ilişkilendirilen verilerin farklı UID'leri vardır.
  • Bir oturumda alt tür verileri, çakışmayan sıralı zaman damgalarıyla uyumlu olmalıdır. Ancak boşluklara izin verilir.
  • Kullanıcı, verilerin sürekli olarak kaydedilmesi yerine bir oturumla ilişkilendirilmesini (ve oturumun parçası olarak izlenmesini) istiyorsa oturumlar yararlı olur.

Uyku seansları

Health Connect'te uyku verilerini okuyabilir veya yazabilirsiniz. Uyku verileri oturum olarak görüntülenir ve 8 farklı uyku aşamasına ayrılabilir:

  • UNKNOWN: Kullanıcının uyuyor olup olmadığı bilinmiyor veya bilinmiyor.
  • AWAKE: Kullanıcı gün içinde değil, uyku döngüsü içinde uyanıktır.
  • SLEEPING: Genel veya ayrıntılı olmayan uyku açıklaması.
  • OUT_OF_BED: Kullanıcı, bir uyku seansının ortasında yataktan çıkar.
  • AWAKE_IN_BED: Kullanıcı yatakta uyanıktır.
  • LIGHT: Kullanıcı hafif bir uyku döngüsündedir.
  • DEEP: Kullanıcı derin bir uyku döngüsündedir.
  • REM: Kullanıcı, REM uyku döngüsündedir.

Bu değerler, kullanıcının belirli bir zaman aralığında yaşadığı uyku türünü temsil eder. Uyku aşamalarını yazmak isteğe bağlıdır, ancak kullanılabiliyorsa önerilir.

Uyku aşamaları olan veya olmayan uyku seanslarını yaz

SleepSessionRecord veri türü iki bölümden oluşur:

  1. Tüm uyku süresini kapsayan genel oturum.
  2. Uyku oturumu sırasında hafif uyku veya derin uyku gibi bağımsız aşamalar.

Aşama olmadan bir uyku seansı şu şekilde eklenir:

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

Bir uyku seansının tüm süresini kapsayan aşamalar şu şekilde eklenebilir:

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

Uyku seansını okuma

Döndürülen her uyku oturumu için uyku evresi verilerinin de mevcut olup olmadığını kontrol etmeniz gerekir:

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

Uyku seansını silme

Bir oturumu bu şekilde silebilirsiniz. Bu örnekte, bir uyku seansını kullandık:

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

Egzersiz seansları

Egzersiz seansları koşudan badminton'a kadar her şeyi içerebilir.

Egzersiz seanslarını yaz

Oturum içeren bir ekleme isteği oluşturmak için aşağıdaki adımları uygulayı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
        )
    )
}

Önceki örnekte, Distance için oturumun tamamını kapsayan bir kaydın nasıl eklendiğini ancak verilerin farklı ayrıntı düzeyinde eklenebildiğini unutmayın.

Uygulama, koşu sırasında mesafeyi düzenli olarak ölçmüşse diğer bir yaklaşım, her biri koşunun bir kısmında katedilen mesafeyi temsil eden birçok Mesafe kaydı eklemek olur.

Egzersiz seansını okuma

Aşağıda, egzersiz oturumunun nasıl okunacağına dair bir örnek verilmiştir:

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

Alt tür verileri yazma

Oturumlar, oturumu ek bilgilerle zenginleştiren zorunlu olmayan alt tür verilerden de oluşabilir.

Örneğin, egzersiz oturumları ExerciseSegment, ExerciseLap ve ExerciseRoute sınıflarını içerebilir:

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
)

Egzersiz seansını silme

Egzersiz seanslarını iki şekilde silebilirsiniz:

  1. Zaman aralığına göre.
  2. UID ile.

Zaman aralığına göre alt tür verilerini nasıl sileceğiniz aşağıda açıklanmıştır:

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

Alt tür verilerini UID'ye göre de silebilirsiniz. Ancak bunu yaptığınızda yalnızca egzersiz oturumu silinir, ilişkili veriler silinmez:

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