Bu kılavuz, Health Connect 1.1.0-alpha12 veya sonraki sürümlerle uyumludur.
Health Connect, kullanıcının uykusuyla ilgili bilgileri (ör. gece uykusu veya gündüz uykusu) depolamak için uyku seansı veri türü sağlar.
Bu oturumları temsil etmek için SleepSessionRecord veri türü kullanılır.
Oturumlar, kullanıcıların belirli bir süre boyunca zamana dayalı performansı (ör. sürekli nabız veya konum verileri) ölçmesine olanak tanır.
SleepSessionRecord oturumları; AWAKE, SLEEPING ve DEEP gibi uyku aşamalarını kaydeden veriler içerir.
Alt tür verileri, bir oturuma "ait" olan ve yalnızca üst oturumla birlikte okunduğunda anlamlı olan verilerdir. Örneğin, uyku aşaması.
İlişkili veriler ise bağımsız olarak kaydedilen ancak bir oturumun zaman aralığına denk gelen verileri ifade eder. Örneğin, bir kullanıcı uyku oturumu sırasında nabız verilerini kaydederse nabız verileri ilişkili veriler olur. Oturum kaydının bir parçası olan alt tür verilerinin aksine, ilişkili veriler her biri kendi UUID'sine sahip bağımsız kayıtlardan oluşur.
Health Connect'in kullanılabilirlik durumunu kontrol etme
Uygulamanız, Health Connect'i kullanmaya çalışmadan önce Health Connect'in kullanıcının cihazında kullanılabilir olduğunu doğrulamalıdır. Health Connect, tüm cihazlara önceden yüklenmemiş veya devre dışı bırakılmış olabilir.
HealthConnectClient.getSdkStatus() yöntemini kullanarak kullanılabilirlik durumunu kontrol edebilirsiniz.
Health Connect'in kullanılabilirliğini kontrol etme
fun checkHealthConnectAvailability(context: Context) { val providerPackageName = "com.google.android.apps.healthdata" val availabilityStatus = HealthConnectClient.getSdkStatus(context, providerPackageName) if (availabilityStatus == HealthConnectClient.SDK_UNAVAILABLE) { // Health Connect is not available. Guide the user to install/enable it. // For example, show a dialog. return // early return as there is no viable integration } if (availabilityStatus == HealthConnectClient.SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED) { // Health Connect is available but requires an update. // Optionally redirect to package installer to find a provider, for example: val uriString = "market://details?id=$providerPackageName&url=healthconnect%3A%2F%2Fonboarding" context.startActivity( Intent(Intent.ACTION_VIEW).apply { setPackage("com.android.vending") data = Uri.parse(uriString) putExtra("overlay", true) putExtra("callerId", context.packageName) } ) return } // Health Connect is available, obtain a HealthConnectClient instance val healthConnectClient = HealthConnectClient.getOrCreate(context) // Issue operations with healthConnectClient }
getSdkStatus() tarafından döndürülen duruma bağlı olarak, kullanıcıyı gerekirse Google Play Store'dan Health Connect'i yüklemeye veya güncellemeye yönlendirebilirsiniz.
Özelliğin kullanılabilirliği
Bu veri türü için özellik kullanılabilirlik işareti yok.
Gerekli izinler
Uyku seansına erişim aşağıdaki izinlerle korunur:
android.permission.health.READ_SLEEPandroid.permission.health.WRITE_SLEEP
Uygulamanıza uyku seansı özelliği eklemek için öncelikle SleepSession veri türü için izin isteyin.
Uyku seansı yazabilmek için beyan etmeniz gereken izin şudur:
<application>
<uses-permission
android:name="android.permission.health.WRITE_SLEEP" />
...
</application>
Uyku seansını okumak için aşağıdaki izinleri istemeniz gerekir:
<application>
<uses-permission
android:name="android.permission.health.READ_SLEEP" />
...
</application>
Kullanıcıdan izin isteme
Uygulamanız, istemci örneği oluşturduktan sonra kullanıcıdan izin istemelidir. Kullanıcıların diledikleri zaman izin vermelerine veya izinleri reddetmelerine olanak tanınmalıdır. Bunun için gerekli veri türlerine yönelik bir izin grubu oluşturun. Öncelikle, kümedeki izinlerin Android manifest dosyanızda beyan edildiğinden emin olun.
val permissions = setOf( HealthPermission.getReadPermission(SleepSessionRecord::class), HealthPermission.getWritePermission(SleepSessionRecord::class) )
getGrantedPermissions yöntemini kullanın. Aksi takdirde bu izinleri istemek için createRequestPermissionResultContract yöntemini kullanın. Health Connect izinleri ekranı açılır.
val permissions = setOf( HealthPermission.getReadPermission(StepsRecord::class), HealthPermission.getWritePermission(StepsRecord::class), HealthPermission.getReadPermission(HeartRateRecord::class), HealthPermission.getWritePermission(HeartRateRecord::class) ) val requestPermissionsLauncher = rememberLauncherForActivityResult( contract = PermissionController.createRequestPermissionResultContract() ) { grantedPermissions -> if (grantedPermissions.containsAll(permissions)) { coroutineScope.launch { snackbarHostState.showSnackbar("Permissions granted!") } } else { coroutineScope.launch { snackbarHostState.showSnackbar("Permissions denied.") } } }
Desteklenen toplamalar
SleepSessionRecord için aşağıdaki toplu değerler kullanılabilir:
Genel kurallar
Health Connect'te uyku seanslarıyla çalışma konusunda en iyi uygulama yönergelerinden bazılarını aşağıda bulabilirsiniz.
- Oturumlar, belirli bir uyku oturumundan veri eklemek için kullanılmalıdır. Uyku için:
suspend fun writeSleepSession(healthConnectClient: HealthConnectClient) { healthConnectClient.insertRecords( listOf( SleepSessionRecord( startTime = Instant.parse("2022-05-10T23:00:00.000Z"), startZoneOffset = ZoneOffset.of("-08:00"), endTime = Instant.parse("2022-05-11T07:00:00.000Z"), endZoneOffset = ZoneOffset.of("-08:00"), title = "My Sleep", metadata = Metadata.activelyRecorded(device = Device(type = Device.TYPE_WATCH)) ), ) ) }
- Alt tür verilerinin, çakışmayan sıralı zaman damgalarına sahip bir oturumda hizalanması gerekir. Ancak boşluklara izin verilir.
- Alt tür verileri UUID içermiyor ancak ilişkili verilerin farklı UUID'leri var.
- Kullanıcı, verilerin sürekli olarak kaydedilmesi yerine bir oturumla ilişkilendirilmesini (ve oturumun bir parçası olarak izlenmesini) istiyorsa oturumlar kullanışlıdır.
Uyku seansları
Health Connect'te uyku verilerini okuyabilir veya yazabilirsiniz. Uyku verileri oturum olarak gösterilir ve 8 farklı uyku aşamasına ayrılabilir:
UNKNOWN: Kullanıcının uyuyup uyumadığı belirtilmemiş veya bilinmiyor.AWAKE: Kullanıcı, gün içinde değil, uyku döngüsü sırasında uyanıktır.SLEEPING: Genel veya ayrıntılı olmayan uyku açıklaması.OUT_OF_BED: Kullanıcı, uyku seansının ortasında yataktan kalkar.AWAKE_IN_BED: Kullanıcı yatakta uyanık.LIGHT: Kullanıcı hafif uyku döngüsünde.DEEP: Kullanıcı derin uyku döngüsünde.REM: Kullanıcı REM uykusu döngüsünde.
Bu değerler, kullanıcının belirli bir zaman aralığında deneyimlediği uyku türünü temsil eder. Uyku aşamalarını yazmak isteğe bağlıdır ancak mümkünse önerilir.
Uyku seanslarını yazma
SleepSessionRecord veri türü iki bölümden oluşur:
- Uykunun tamamını kapsayan genel oturum.
- Uyku oturumu sırasında hafif uyku veya derin uyku gibi ayrı aşamalar.
Aşamasız bir uyku seansı eklemek için:
val zoneRules = ZoneId.systemDefault().rules // Calculate the specific offset for both start and end times val startOffset = zoneRules.getOffset(startTime) val endOffset = zoneRules.getOffset(endTime) SleepSessionRecord( title = "weekend sleep", startTime = startTime, endTime = endTime, startZoneOffset = startOffset, endZoneOffset = endOffset, metadata = Metadata.activelyRecorded(device = Device(type = Device.TYPE_WATCH)) )
Bir uyku seansının tamamını kapsayan aşamaları eklemek için:
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 seansı için uyku aşaması verilerinin de mevcut olup olmadığını kontrol etmeniz gerekir:
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
Oturumları bu şekilde silebilirsiniz. Bu örnekte bir uyku oturumu kullandık:
val timeRangeFilter = TimeRangeFilter.between(sleepRecord.startTime, sleepRecord.endTime) healthConnectClient.deleteRecords(SleepSessionRecord::class, timeRangeFilter)