Bu kılavuz, Health Connect'in 1.1.0-alpha12 sürümüyle uyumludur.
Bu kılavuzda, Health Connect'te veri yazma veya güncelleme süreci açıklanmaktadır.
Sıfır değerleri işleme
Adım, mesafe veya kalori gibi bazı veri türlerinin değeri 0 olabilir.
Yalnızca kullanıcı cihazı takarken gerçek hareketsizliği yansıttığında sıfır değerleri yazın. Cihaz takılmadıysa, veriler eksikse veya pil bittiyse sıfır değeri yazmayın. Bu gibi durumlarda, yanıltıcı verileri önlemek için kaydı atlayın.
Veri yapısını ayarlama
Veri yazmadan önce kayıtları ayarlamamız gerekir. 50'den fazla veri türü için her birinin kendi yapısı vardır. Kullanılabilen veri türleri hakkında daha fazla bilgi için Jetpack referansını inceleyin.
Temel kayıtlar
Health Connect'teki Adımlar veri türü, kullanıcının okumalar arasında attığı adım sayısını kaydeder. Adım sayısı, sağlık, fitness ve sağlıklı yaşam platformlarında yaygın olarak kullanılan bir ölçümdür.
Aşağıdaki örnekte, adım sayısı verilerinin nasıl ayarlanacağı gösterilmektedir:
val zoneOffset = ZoneOffset.systemDefault().rules.getOffset(startTime) val stepsRecord = StepsRecord( count = 120, startTime = startTime, endTime = endTime, startZoneOffset = zoneOffset, endZoneOffset = zoneOffset, metadata = Metadata( device = Device(type = Device.TYPE_WATCH), recordingMethod = Metadata.RECORDING_METHOD_AUTOMATICALLY_RECORDED ) ) healthConnectClient.insertRecords(listOf(stepsRecord))
Ölçü birimleri içeren kayıtlar
Health Connect, doğruluğu sağlamak için değerleri ölçü birimleriyle birlikte saklayabilir. Buna örnek olarak, kapsamlı ve geniş bir veri türü olan Beslenme verileri verilebilir. Toplam karbonhidratlardan vitaminlere kadar çeşitli isteğe bağlı besin alanları içerir. Her veri noktası, bir öğün veya yiyecek öğesi kapsamında tüketilmiş olabilecek besinleri temsil eder.
Bu veri türünde tüm besinler Kütle birimleriyle, energy ise Enerji birimiyle gösterilir.
Aşağıdaki örnekte, muz yiyen bir kullanıcı için beslenme verilerinin nasıl ayarlanacağı gösterilmektedir:
val endTime = Instant.now() val startTime = endTime.minus(Duration.ofMinutes(1)) val banana = NutritionRecord( name = "banana", energy = 105.0.kilocalories, dietaryFiber = 3.1.grams, potassium = 0.422.grams, totalCarbohydrate = 27.0.grams, totalFat = 0.4.grams, saturatedFat = 0.1.grams, sodium = 0.001.grams, sugar = 14.0.grams, vitaminB6 = 0.0005.grams, vitaminC = 0.0103.grams, startTime = startTime, endTime = endTime, startZoneOffset = ZoneOffset.UTC, endZoneOffset = ZoneOffset.UTC, metadata = Metadata( device = Device(type = Device.TYPE_PHONE) ) )
Seri verileri içeren kayıtlar
Health Connect, bir dizi verinin listesini saklayabilir. Örneğin, okumalar arasında algılanan bir dizi kalp atışı örneğini yakalayan nabız veri türü.
Bu veri türünde, samples parametresi bir nabız örnekleri listesiyle gösterilir. Her örnekte bir beatsPerMinute
değeri ve bir time değeri bulunur.
Aşağıdaki örnekte, kalp atış hızı serisi verilerinin nasıl ayarlanacağı gösterilmektedir:
val endTime = Instant.now() val startTime = endTime.minus(Duration.ofMinutes(5)) val heartRateRecord = HeartRateRecord( startTime = startTime, startZoneOffset = ZoneOffset.UTC, endTime = endTime, endZoneOffset = ZoneOffset.UTC, // records 10 arbitrary data, to replace with actual data samples = List(10) { index -> HeartRateRecord.Sample( time = startTime + Duration.ofSeconds(index.toLong()), beatsPerMinute = 100 + index.toLong(), ) }, metadata = Metadata( device = Device(type = Device.TYPE_WATCH) ))
Kullanıcıdan izin isteme
İstemci örneği oluşturduktan sonra uygulamanızın kullanıcıdan izin istemesi gerekir. Kullanıcılar, izinleri istedikleri zaman verebilmeli veya reddedebilmelidir. Bunu yapmak için gerekli veri türleri için bir dizi izin oluşturun. Gruptaki izinlerin önce Android manifestinizde tanımlandığından emin olun.
val permissions = setOf( HealthPermission.getReadPermission(HeartRateRecord::class), HealthPermission.getWritePermission(HeartRateRecord::class), HealthPermission.getReadPermission(StepsRecord::class), HealthPermission.getWritePermission(StepsRecord::class) )
getGrantedPermissions
kullanın. Sahip değilse bu izinleri istemek için
createRequestPermissionResultContract
kullanın. Bu işlem, Health Connect izinleri ekranını gösterir.
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.") } } }
Verileri yazma
Health Connect'teki yaygın iş akışlarından biri veri yazmaktır. Kayıt eklemek için insertRecords kullanın.
Aşağıdaki örnekte, adım sayılarını ekleme verilerinin nasıl yazılacağı gösterilmektedir:
val zoneOffset = ZoneOffset.systemDefault().rules.getOffset(startTime) val stepsRecord = StepsRecord( count = 120, startTime = startTime, endTime = endTime, startZoneOffset = zoneOffset, endZoneOffset = zoneOffset, metadata = Metadata( device = Device(type = Device.TYPE_WATCH), recordingMethod = Metadata.RECORDING_METHOD_AUTOMATICALLY_RECORDED ) ) healthConnectClient.insertRecords(listOf(stepsRecord))
Verileri güncelleme
Bir veya daha fazla kaydı değiştirmeniz gerekiyorsa (özellikle uygulama veri deponuzu Health Connect'teki verilerle senkronize etmeniz gerektiğinde) verilerinizi güncelleyebilirsiniz. Mevcut verileri güncellemenin iki yolu vardır. Bu yollar, kayıtları bulmak için kullanılan tanımlayıcıya bağlıdır.
Meta veri
Veriler güncellenirken bu sınıf gerekli olduğundan, önce Metadata sınıfını incelemeniz önerilir. Oluşturma sırasında, Health Connect'teki her Record öğesinin bir metadata alanı vardır. Aşağıdaki özellikler senkronizasyonla ilgilidir:
| Özellikler | Açıklama |
|---|---|
id
|
Health Connect'teki her Record, benzersiz bir id değerine sahiptir.Yeni bir kayıt eklenirken Health Connect bu değeri otomatik olarak doldurur. |
lastModifiedTime
|
Her Record, kaydın son değiştirilme zamanını da takip eder.Bu alan, Health Connect tarafından otomatik olarak doldurulur. |
clientRecordId
|
Her Record, uygulama veri deponuzda referans olarak kullanılmak üzere kendisiyle ilişkili benzersiz bir kimliğe sahip olabilir.
Bu değeri uygulamanız sağlar. |
clientRecordVersion
|
Bir kayıtta clientRecordId varsa verilerin uygulama veri deponuzdaki sürümle senkronize kalmasına izin vermek için clientRecordVersion kullanılabilir.Uygulamanız bu değeri sağlar. |
Okuma süresine göre güncelleme
Verileri güncellemek için önce gerekli kayıtları hazırlayın. Gerekirse kayıtlarda değişiklik yapın. Ardından, değişiklikleri yapmak için updateRecords numaralı telefonu arayın.
Aşağıdaki örnekte verilerin nasıl güncelleneceği gösterilmektedir. Bu amaçla, her kaydın saat dilimi farkı değerleri PST'ye göre ayarlanır.
suspend fun updateSteps( healthConnectClient: HealthConnectClient, prevRecordStartTime: Instant, prevRecordEndTime: Instant ) { try { val request = healthConnectClient.readRecords( ReadRecordsRequest( recordType = StepsRecord::class, timeRangeFilter = TimeRangeFilter.between( prevRecordStartTime, prevRecordEndTime ) ) ) val newStepsRecords = arrayListOf<StepsRecord>() for (record in request.records) { // Adjusted both offset values to reflect changes val sr = StepsRecord( count = record.count, startTime = record.startTime, startZoneOffset = record.startTime.atZone(ZoneId.of("PST")).offset, endTime = record.endTime, endZoneOffset = record.endTime.atZone(ZoneId.of("PST")).offset, metadata = record.metadata ) newStepsRecords.add(sr) } healthConnectClient.updateRecords(newStepsRecords) } catch (e: Exception) { // Run error handling here } }
Müşteri kaydı kimliği aracılığıyla ekleme/güncelleme
İsteğe bağlı Müşteri Kaydı Kimliği ve Müşteri Kaydı Sürümü değerlerini kullanıyorsanız updateRecords yerine insertRecords kullanmanızı öneririz.
insertRecords işlevi, verileri ekleme/güncelleme özelliğine sahiptir.
Veriler, verilen istemci kaydı kimlikleri grubuna göre Health Connect'te varsa üzerine yazılır. Aksi takdirde yeni veri olarak yazılır.
Bu senaryo, uygulama veri deponuzdaki verileri Health Connect ile senkronize etmeniz gerektiğinde kullanışlıdır.
Aşağıdaki örnekte, uygulama veri deposundan çekilen verilerde nasıl upsert işlemi yapılacağı gösterilmektedir:
fun pullStepsFromDatastore(startTime: Instant, endTime: Instant) : ArrayList<StepsRecord> { val appStepsRecords = arrayListOf<StepsRecord>() // Pull data from app datastore // ... // Make changes to data if necessary // ... // Store data in appStepsRecords // ... var sr = StepsRecord( metadata = Metadata( clientRecordId = "Your client record ID", device = Device(type = Device.TYPE_WATCH) ), startTime = startTime, startZoneOffset = startTime.atZone(ZoneId.of("PST")).offset, endTime = endTime, endZoneOffset = endTime.atZone(ZoneId.of("PST")).offset, count = 120 ) appStepsRecords.add(sr) // ... return appStepsRecords } suspend fun upsertSteps( healthConnectClient: HealthConnectClient, newStepsRecords: ArrayList<StepsRecord> ) { try { healthConnectClient.insertRecords(newStepsRecords) } catch (e: Exception) { // Run error handling here } }
Ardından, bu işlevleri ana iş parçacığınızda çağırabilirsiniz.
upsertSteps(healthConnectClient, pullStepsFromDatastore( startTime = startTime, endTime = endTime ))
Müşteri Kaydı Sürümünde değer kontrolü
Veri ekleme/güncelleme sürecinizde İstemci Kaydı Sürümü varsa Health Connect, clientRecordVersion değerlerinde karşılaştırma kontrolleri yapar. Eklenen verilerdeki sürüm, mevcut verilerdeki sürümden yüksekse ekleme/güncelleme işlemi gerçekleşir. Aksi takdirde, süreç değişikliği yoksayar ve değer aynı kalır.
Verilerinize sürüm oluşturmayı dahil etmek için sürüm oluşturma mantığınıza göre Metadata.clientRecordVersion ile Long değeri sağlamanız gerekir.
val endTime = Instant.now() val startTime = endTime.minus(Duration.ofMinutes(15)) val stepsRecord = StepsRecord( count = 100L, startTime = startTime, startZoneOffset = ZoneOffset.UTC, endTime = endTime, endZoneOffset = ZoneOffset.UTC, metadata = Metadata( clientRecordId = "Your supplied record ID", clientRecordVersion = 0L, // Your supplied record version device = Device(type = Device.TYPE_WATCH) ) )
Güncelleme ekleme işlemleri, değişiklik olduğunda version değerini otomatik olarak artırmaz. Bu sayede, verilerin beklenmedik şekilde üzerine yazılması önlenir. Bu durumda, değeri manuel olarak daha yüksek bir değerle sağlamanız gerekir.
Genel kurallar
Uygulamanız, desteklenen tüm birinci taraf verilerini yazmalıdır. İsteğe bağlı olarak, uygulamanızın üçüncü taraf kaynaklardan elde edilen verileri yazmasını seçebilirsiniz. Ancak uygulamanız Health Connect'ten veri okuduysa bu veriler Health Connect'e geri yazılmamalıdır.
Başka bir kaynaktan içe aktarılan veya türetilen verileri yazarken, bunların kaynağını ve kaynak cihaz meta verilerini doğru şekilde ilişkilendirmeniz beklenir. Bunu yapmak için her yazılı kayıtla ilgili aşağıdaki meta verileri sağlamanız gerekir:
recordingMethod: Otomatik veya manuel olarak kaydedilen veriler için kayıt yönteminin, kaydedilen etkinlik türünü yansıtacak şekilde güncellenmesini bekliyoruz:RECORDING_METHOD_AUTOMATICALLY_RECORDED: Veriler otomatik olarak kaydedildiyse (ör. fitness bandı, kullanıcının koşuya çıktığını otomatik olarak algıladıysa).RECORDING_METHOD_ACTIVELY_RECORDED: Kullanıcı, giyilebilir cihazında bisiklete binme gibi yeni bir etkinliğe başladıysa.RECORDING_METHOD_MANUAL_ENTRY: Kullanıcı verileri manuel olarak girdiyse.
device.type: DesteklenenDevicetürlerinden birini kullanarak cihaz türü belirtmeniz gerekir.device.manufacturer: Cihazın üreticisi (ör. "Fitbit").device.model: Cihazın modeli (ör. "Charge 3")
Meta verilerin doğru şekilde ayarlanması, veri şeffaflığı açısından çok önemlidir ve kullanıcıların sağlık bilgilerinin nereden geldiğini anlamasına yardımcı olur. Tüm ayrıntılar için Health Connect meta veri kılavuzuna bakın.
Uygulamanızdaki veriler başka bir uygulamadan içe aktarıldıysa kendi verilerini Health Connect'e yazma sorumluluğu diğer uygulamaya aittir.
Ayrıca, verilerin sınırların dışında olması veya dahili bir sistem hatası gibi yazma istisnalarını işleyen bir mantık uygulamanız da önerilir. Geri çekilme ve yeniden deneme stratejilerinizi bir iş planlama mekanizmasında uygulayabilirsiniz. Health Connect'e yazma işlemi başarısız olursa uygulamanızın bu dışa aktarma noktasını geçebildiğinden emin olun. Teşhisi kolaylaştırmak için hataları günlüğe kaydetmeyi ve bildirmeyi unutmayın.
Verileri izlerken uygulamanızın verileri yazma şekline bağlı olarak birkaç öneriden yararlanabilirsiniz.
Saat dilimi işleme
Zamana dayalı kayıtlar yazarken, kullanıcılar diğer bölgelerdeyken yanlış zaman damgalarına yol açabileceğinden, varsayılan olarak zoneOffset.UTC'ye ofset ayarlamaktan kaçının. Bunun yerine, ofseti cihazın gerçek konumuna göre hesaplayın. Cihazın saat dilimini ZoneId.systemDefault() kullanarak alabilirsiniz.
val endTime = Instant.now() val startTime = endTime.minus(Duration.ofDays(1)) val stepsRecords = mutableListOf<StepsRecord>() var sampleTime = startTime val minutesBetweenSamples = 15L while (sampleTime < endTime) { // Get the default ZoneId then convert it to an offset val zoneOffset = ZoneOffset.systemDefault().rules.getOffset(sampleTime) stepsRecords += StepsRecord( startTime = sampleTime.minus(Duration.ofMinutes(minutesBetweenSamples)), startZoneOffset = zoneOffset, endTime = sampleTime, endZoneOffset = zoneOffset, count = Random.nextLong(1, 100), metadata = Metadata(), ) sampleTime = sampleTime.plus(Duration.ofMinutes(minutesBetweenSamples)) } healthConnectClient.insertRecords( stepsRecords )
Daha fazla ayrıntı için ZoneId ile ilgili dokümanları inceleyin.
Yazma sıklığı ve ayrıntı düzeyi
Health Connect'e veri yazarken uygun çözünürlüğü kullanın. Uygun çözünürlüğü kullanmak, tutarlı ve doğru verileri korurken depolama yükünü azaltmaya yardımcı olur. Veri çözünürlüğü iki şeyi kapsar:
- Yazma sıklığı: Uygulamanızın Health Connect'e ne sıklıkta yeni veri yazdığı.
- Yeni veriler kullanıma sunulduğunda cihaz performansını göz önünde bulundurarak verileri mümkün olduğunca sık yazın.
- Pil ömrünü ve diğer performans özelliklerini olumsuz etkilememek için yazma işlemleri arasındaki maksimum aralık 15 dakika olmalıdır.
- Yazılan verilerin ayrıntı düzeyi: Verilerin ne sıklıkta örneklendiği.
- Örneğin, her 5 saniyede bir nabız örneği yazın.
- Her veri türü için aynı örnekleme hızı gerekmez. Adım sayısı verilerini 60 saniyede bir gibi daha seyrek bir sıklık yerine her saniye güncellemenin pek bir faydası yoktur.
- Daha yüksek örnekleme hızları, kullanıcılara sağlık ve fitness verileriyle ilgili daha ayrıntılı ve ayrıntılı bir görünüm sunabilir. Örnekleme sıklığı, ayrıntı ve performans arasında denge kurmalıdır.
Ek kurallar
Veri yazarken aşağıdaki yönergeleri uygulayın:
- Her senkronizasyonda yalnızca yeni verileri ve son senkronizasyondan bu yana değiştirilen güncellenmiş verileri yazın.
- Yazma isteği başına en fazla 1.000 kayıt olacak şekilde istekleri parçalayın.
- Görevlerin yalnızca cihaz boşta kaldığında ve pil seviyesi düşük olmadığında çalışmasını sağlayın.
- Arka plan görevleri için WorkManager'ı kullanarak maksimum 15 dakikalık süreyle düzenli görevler planlayın.
Aşağıdaki kod, WorkManager kitaplığını kullanarak 15 dakikalık maksimum süre ve 5 dakikalık esneklik aralığıyla düzenli arka plan görevleri planlar. Bu yapılandırma, PeriodicWorkRequest.Builder sınıfı kullanılarak ayarlanır.
val constraints = Constraints.Builder()
.requiresBatteryNotLow()
.requiresDeviceIdle(true)
.build()
val writeDataWork = PeriodicWorkRequestBuilder<WriteDataToHealthConnectWorker>(
15,
TimeUnit.MINUTES,
5,
TimeUnit.MINUTES
)
.setConstraints(constraints)
.build()
Etkin izleme
Egzersiz ve uyku gibi etkinliğe dayalı izleme veya beslenme gibi manuel kullanıcı girişi yapan uygulamalar buna dahildir. Bu kayıtlar, uygulama ön planda olduğunda veya günde birkaç kez kullanıldığı nadir durumlarda oluşturulur.
Uygulamanızın, Health Connect'i etkinliğin tamamı boyunca çalıştırmadığını doğrulayın.
Veriler Health Connect'e iki şekilde yazılabilir:
- Etkinlik tamamlandıktan sonra verileri Health Connect ile senkronize edin. Örneğin, kullanıcı izlenen bir egzersiz oturumunu sonlandırdığında verileri senkronize edin.
- Verileri daha sonra senkronize etmek için
WorkManagersimgesini kullanarak tek seferlik bir görev planlayın.
Yazma işlemlerinin ayrıntı düzeyi ve sıklığıyla ilgili en iyi uygulamalar
Health Connect'e veri yazarken uygun çözünürlüğü kullanın. Uygun çözünürlüğü kullanmak, tutarlı ve doğru verileri korurken depolama yükünü azaltmaya yardımcı olur. Veri çözünürlüğü 2 şeyi kapsar:
Yazma sıklığı: Uygulamanızın yeni verileri Health Connect'e ne sıklıkta aktardığı. Yeni veriler kullanıma sunulduğunda cihaz performansını göz önünde bulundurarak verileri mümkün olduğunca sık yazın. Pil ömrünü ve diğer performans özelliklerini olumsuz etkilememek için yazma işlemleri arasındaki maksimum aralık 15 dakika olmalıdır.
Yazılan verilerin ayrıntı düzeyi: Gönderilen verilerin ne sıklıkta örneklenmiş olduğu. Örneğin, her 5 saniyede bir nabız örneği yazın. Her veri türü aynı örnekleme hızını gerektirmez. Adım sayısı verilerini 60 saniyede bir gibi daha az sıklıkta güncellemek yerine her saniyede bir güncellemenin pek bir faydası yoktur. Ancak daha yüksek örnekleme hızları, kullanıcılara sağlık ve fitness verileriyle ilgili daha ayrıntılı ve ayrıntılı bir görünüm sunabilir. Örnekleme hızı frekansları, ayrıntı ve performans arasında bir denge kurmalıdır.
Dizi verileri için kayıtları yapılandırma
HeartRateRecord gibi bir dizi örnek kullanan veri türleri için kayıtlarınızı doğru şekilde yapılandırmanız önemlidir. Sürekli güncellenen tek bir günlük kayıt oluşturmak yerine, her biri belirli bir zaman aralığını temsil eden birden fazla küçük kayıt oluşturmanız gerekir.
Örneğin, nabız verileri için her dakika için yeni bir HeartRateRecord oluşturmanız gerekir. Her kaydın, o dakikayı kapsayan bir başlangıç ve bitiş zamanı olur ve o dakika içinde alınan tüm nabız örneklerini içerir.
Health Connect ile düzenli senkronizasyonlar sırasında (ör. her 15 dakikada bir) uygulamanız, önceki senkronizasyondan bu yana oluşturulan tüm bir dakikalık kayıtları yazmalıdır. Bu sayede kayıtlar yönetilebilir bir boyutta tutulur ve verilerin sorgulanması ile işlenmesi performansı artırılır.
Aşağıdaki örnekte, birden fazla örnek içeren bir dakikalık HeartRateRecord nasıl oluşturulacağı gösterilmektedir:
val startTime = Instant.now().truncatedTo(ChronoUnit.MINUTES) val endTime = startTime.plus(Duration.ofMinutes(1)) val heartRateRecord = HeartRateRecord( startTime = startTime, startZoneOffset = ZoneOffset.UTC, endTime = endTime, endZoneOffset = ZoneOffset.UTC, // Create a new record every minute, containing a list of samples. samples = listOf( HeartRateRecord.Sample( time = startTime + Duration.ofSeconds(15), beatsPerMinute = 80, ), HeartRateRecord.Sample( time = startTime + Duration.ofSeconds(30), beatsPerMinute = 82, ), HeartRateRecord.Sample( time = startTime + Duration.ofSeconds(45), beatsPerMinute = 85, ) ), metadata = Metadata( device = Device(type = Device.TYPE_WATCH) ))
Gün boyunca izlenen verileri yazma
Adımlar gibi sürekli olarak toplanan veriler için uygulamanız, yeni veriler kullanılabilir olduğunda mümkün olduğunca sık Health Connect'e yazmalıdır. Pil ömrünü ve diğer performans yönlerini olumsuz etkilememek için yazma işlemleri arasındaki maksimum aralık 15 dakika olmalıdır.
Veri türü |
Birim |
Beklenen |
Örnek |
Adımlar |
adım |
Dakikada bir |
23:14 - 23:15 - 5 adım 23:16 - 23:17 - 22 adım 23:17 - 23:18 - 8 adım |
StepsCadence |
adım/dk. |
Dakikada bir |
23:14 - 23:15 - 5 adım/dk. 23:16 - 23:17 - 22 adım/dk. 23:17 - 23:18 - 8 adım/dk. |
Tekerlekli sandalye itme sayısı |
itme egzersizleri |
Dakikada bir |
23:14 - 23:15 - 5 push 23:16 - 23:17 - 22 anlık bildirim 23:17 - 23:18 - 8 anlık bildirim |
ActiveCaloriesBurned |
Kalori |
15 dakikada bir |
23:15 - 23:30 - 2 Kalori 23:30 - 23:45 - 25 Kalori 23:45 - 00:00 - 5 Kalori |
TotalCaloriesBurned |
Kalori |
15 dakikada bir |
23:15 - 23:30 - 16 Kalori 23:30 - 23:45 - 16 Kalori 23:45 - 00:00 - 16 Kalori |
Mesafe |
km/dk |
Dakikada bir |
23:14-23:15 - 0,008 km 23:16 - 23:16 - 0,021 km 23:17 - 23:18 - 0,012 km |
ElevationGained |
m |
Dakikada bir |
20:36 - 20:37 - 3.048m 20:39 - 20:40 - 3.048m 23:23 - 23:24 - 9.144m |
FloorsClimbed |
kat |
Dakikada bir |
23:14 - 23:15 - 5 kat 23:16 - 23:16 - 22 kat 23:17 - 23:18 - 8 kat |
HeartRate |
bpm |
Dakikada 4 kez |
6:11:15 - 55 nabız/dk 6:11:30 - 56 nabız/dk. 6:11:45 - 56 nabız/dk 6:12:00 - 55 nabız/dk. |
HeartRateVariabilityRmssd |
ms |
Dakikada bir |
6:11 - 23 ms |
RespiratoryRate |
nefes/dakika |
Dakikada bir |
23:14 - 23:15 - 60 nefes/dakika 23:16 - 23:16 - 62 nefes/dakika 23:17 - 23:18 - 64 nefes/dakika |
OxygenSaturation |
% |
Saatte bir |
6:11 - %95,208 |
Veriler, antrenman veya uyku seansının sonunda Health Connect'e yazılmalıdır. Egzersiz ve uyku gibi etkin izleme veya beslenme gibi manuel kullanıcı girişi için bu kayıtlar, uygulama ön planda olduğunda ya da gün içinde birkaç kez kullanıldığı nadir durumlarda oluşturulur.
Uygulamanızın, etkinliğin tamamı boyunca Health Connect'i çalıştırmadığını doğrulayın.
Veriler Health Connect'e iki şekilde yazılabilir:
- Etkinlik tamamlandıktan sonra verileri Health Connect ile senkronize edin. Örneğin, kullanıcı izlenen bir egzersiz oturumunu sonlandırdığında verileri senkronize edin.
- Verileri daha sonra senkronize etmek için WorkManager'ı kullanarak tek seferlik bir görev planlayın.
Egzersiz ve uyku oturumları
Uygulamanız en azından Tablo 2'deki Beklenen sütunundaki yönergeleri uygulamalıdır. Mümkün olduğunda En İyi sütunundaki yönergeleri uygulayın.
Aşağıdaki tabloda, egzersiz sırasında verilerin nasıl yazılacağı gösterilmektedir:
Veri türü |
Birim |
Beklenen |
Saygılarımızla, |
Örnek |
Adımlar |
adım |
Dakikada bir |
Saniyede bir |
23:14-23:15 - 5 adım 23:16 - 23:17 - 22 adım 23:17 - 23:18 - 8 adım |
StepsCadence |
adım/dk. |
Dakikada bir |
Saniyede bir |
23:14-23:15 - 35 adım/dk. 23:16 - 23:17 - 37 adım/dk. 23:17 - 23:18 - 40 adım/dk. |
Tekerlekli sandalye itme sayısı |
itme egzersizleri |
Dakikada bir |
Saniyede bir |
23:14-23:15 - 5 push 23:16 - 23:17 - 22 anlık bildirim 23:17 - 23:18 - 8 anlık bildirim |
CyclingPedalingCadence |
devir/dk. |
Dakikada bir |
Saniyede bir |
23:14-23:15 - 65 rpm 23:16 - 23:17 - 70 rpm 23:17 - 23:18 - 68 rpm |
Güç |
vat |
Dakikada bir |
Saniyede bir |
23:14-23:15 - 250 vat 23:16 - 23:17 - 255 vat 23:17 - 23:18 - 245 vat |
Hız |
km/dk |
Dakikada bir |
Saniyede bir |
23:14-23:15 - 0,3 km/dk. 23:16 - 23:17 - 0,4 km/dk. 23:17 - 23:18 -0,4 km/dk. |
Mesafe |
km/dk. |
Dakikada bir |
Saniyede bir |
23:14-23:15 - 0,008 km 23:16 - 23:16 - 0,021 km 23:17 - 23:18 - 0,012 km |
ActiveCaloriesBurned |
Kalori |
Dakikada bir |
Saniyede bir |
23:14-23:15 - 20 Kalori 23:16 - 23:17 - 20 Kalori 23:17 - 23:18 - 25 Kalori |
TotalCaloriesBurned |
Kalori |
Dakikada bir |
Saniyede bir |
23:14-23:15 - 36 Kalori 23:16 - 23:17 - 36 Kalori 23:17 - 23:18 - 41 Kalori |
ElevationGained |
m |
Dakikada bir |
Saniyede bir |
20:36 - 20:37 - 3.048m 20:39 - 20:40 - 3.048m 23:23 - 23:24 - 9.144m |
ExerciseRoutes |
lat/lng/alt |
3-5 saniyede bir |
Saniyede bir |
|
HeartRate |
bpm |
Dakikada 4 kez |
Saniyede bir |
23:14-23:15 - 150 bpm |
Tablo 3'te, uyku oturumu sırasında veya sonrasında verilerin nasıl yazılacağı gösterilmektedir:
Veri türü |
Birim |
Beklenen örnekler |
Örnek |
Uyku Aşaması |
sürecin |
Uyku aşaması başına ayrıntılı süre |
23:46 - 23:50 - uyanık 23:50 - 23:56 - hafif uyku 23:56 - 00:16 - derin uyku |
RestingHeartRate |
bpm |
Tek günlük değer (sabah ilk iş olarak beklenir) |
6:11 - 60 bpm |
OxygenSaturation |
% |
Tek günlük değer (sabah ilk iş olarak beklenir) |
6:11 - %95,208 |
Çoklu spor etkinlikleri
Bu yaklaşımda mevcut veri türleri ve yapıları kullanılır. Ayrıca, mevcut Health Connect uygulamaları ve veri okuyucularıyla uyumluluk doğrulanır. Bu, fitness platformlarının yaygın olarak kullandığı bir yaklaşımdır.
Ayrıca, yüzme, bisiklet sürme ve koşma gibi bireysel oturumlar Health Connect'te doğal olarak bağlantılı değildir. Veri okuyucular, bu oturumlar arasındaki ilişkiyi zaman yakınlıklarına göre tahmin etmelidir. Yüzmeden bisiklete binmeye geçiş gibi segmentler arasındaki geçişler açıkça gösterilmez.
Aşağıdaki örnekte, triatlon için verilerin nasıl yazılacağı gösterilmektedir:
val swimStartTime = Instant.parse("2024-08-22T08:00:00Z") val swimEndTime = Instant.parse("2024-08-22T08:30:00Z") val bikeStartTime = Instant.parse("2024-08-22T08:40:00Z") val bikeEndTime = Instant.parse("2024-08-22T09:40:00Z") val runStartTime = Instant.parse("2024-08-22T09:50:00Z") val runEndTime = Instant.parse("2024-08-22T10:20:00Z") val swimSession = ExerciseSessionRecord( startTime = swimStartTime, endTime = swimEndTime, exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_SWIMMING_OPEN_WATER, metadata = Metadata( device = Device(type = Device.TYPE_WATCH) ), startZoneOffset = null, endZoneOffset = null, ) val bikeSession = ExerciseSessionRecord( startTime = bikeStartTime, endTime = bikeEndTime, exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_BIKING, metadata = Metadata( device = Device(type = Device.TYPE_WATCH) ), startZoneOffset = null, endZoneOffset = null, ) val runSession = ExerciseSessionRecord( startTime = runStartTime, endTime = runEndTime, exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_RUNNING, metadata = Metadata( device = Device(type = Device.TYPE_WATCH) ), startZoneOffset = null, endZoneOffset = null, ) healthConnectClient.insertRecords(listOf(swimSession, bikeSession, runSession))
İstisnaları işleme
Health Connect, bir sorunla karşılaşıldığında CRUD işlemleri için standart istisnalar oluşturur. Uygulamanız bu istisnaların her birini uygun şekilde yakalayıp işlemelidir.
HealthConnectClient üzerindeki her yöntemde oluşturulabilecek istisnalar listelenir.
Genel olarak, uygulamanız aşağıdaki istisnaları işlemelidir:
| İstisna | Açıklama | Önerilen en iyi uygulama |
|---|---|---|
IllegalStateException
| Aşağıdaki senaryolardan biri gerçekleşti:
| İstek göndermeden önce girişlerle ilgili olası sorunları giderin. Hata işleme stratejileri uygulayabilmek için değişkenlere değer atayın veya bunları isteklerinizde doğrudan kullanmak yerine özel bir işlevde parametre olarak kullanın. |
IOException
| Diskten veri okuma ve diske veri yazma sırasında sorunlar oluştu. | Bu sorunu önlemek için aşağıdaki önerilerden yararlanabilirsiniz:
|
RemoteException
| SDK'nın bağlandığı temel hizmette veya bu hizmetle iletişimde hatalar oluşmuştur. Örneğin, uygulamanız belirli bir uid ile kaydı silmeye çalışıyor. Ancak, temel hizmette kontrol ettikten sonra kaydın mevcut olmadığını öğrenen uygulama, istisnayı başlatıyor.uid | Bu sorunu önlemek için aşağıdaki önerilerden yararlanabilirsiniz:
|
SecurityException
| İstekler, verilmeyen izinler gerektirdiğinde sorunlar oluşur. | Bunu önlemek için yayınlanmış uygulamanızda Health Connect veri türlerinin kullanımını beyan ettiğinizden emin olun. Ayrıca, Health Connect izinlerini manifest dosyasında ve etkinliğinizde beyan etmeniz gerekir. |