Verileri yazma

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 sayısı, mesafe veya kalori gibi bazı veri türlerinin değeri 0 olabilir. Yalnızca kullanıcı cihazı takarken gerçek etkinliğ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ü vardır ve her birinin kendi yapısı bulunur. Kullanılabilen veri türleri hakkında daha fazla bilgi için Jetpack referansı'na bakın.

Temel kayıtlar

Health Connect'teki Adımlar veri türü, kullanıcının okumalar arasında attığı adım sayısını yakalar. 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.autoRecorded(
        device = Device(type = Device.TYPE_WATCH)
    )
)
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 bir örnek, kapsamlı ve geniş bir veri türü olan Beslenme'dir. 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ının 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.activelyRecorded(
        device = Device(type = Device.TYPE_PHONE)
    )
)

Seri verileri içeren kayıtlar

Health Connect, bir dizi verinin listesini saklayabilir. Buna örnek olarak, okumalar arasında tespit edilen bir dizi kalp atışı örneğini yakalayan kalp atış hızı veri türü verilebilir.

Bu veri türünde, samples parametresi bir kalp atış hızı örnekleri listesiyle temsil edilir. 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.activelyRecorded(
        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ılara diledikleri zaman izin verme veya reddetme olanağı tanınmalıdır. Bunun için gerekli veri türleri için bir izin grubu oluşturun. Gruptaki izinlerin önce Android manifestinizde beyan edildiğinden emin olun.

val permissions =
    setOf(
        HealthPermission.getReadPermission(HeartRateRecord::class),
        HealthPermission.getWritePermission(HeartRateRecord::class),
        HealthPermission.getReadPermission(StepsRecord::class),
        HealthPermission.getWritePermission(StepsRecord::class)
    )
Uygulamanıza gerekli izinlerin verilip verilmediğini görmek için getGrantedPermissions kullanın. Aksi takdirde, bu izinleri istemek için createRequestPermissionResultContract seçeneğini 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.") }
    }
}
Kullanıcılar izinleri istedikleri zaman verebilir veya iptal edebilir. Bu nedenle, uygulamanız izinleri kullanmadan önce her seferinde kontrol etmeli ve izinlerin kaybedildiği senaryoları ele almalıdır.

Verileri yazma

Health Connect'teki yaygın iş akışlarından biri veri yazmadır. Kayıt eklemek için insertRecords simgesini 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.autoRecorded(
        device = Device(type = Device.TYPE_WATCH)
    )
)
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şturulduğunda, Health Connect'teki her Record öğesinin bir metadata alanı olur. 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 alanı otomatik olarak doldurur.
lastModifiedTime Her Record, kaydın en son değiştirildiği zamanı 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şkilendirilmiş benzersiz bir kimliğe sahip olabilir.
Bu değer, uygulamanız tarafından sağlanır.
clientRecordVersion Bir kayıtta clientRecordId varsa clientRecordVersion, verilerin uygulama veri deponuzdaki sürümle senkronize kalmasına izin vermek için kullanılabilir.
Bu değer, uygulamanız tarafından sağlanır.

Okuma zaman aralığına 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
    }
}

İstemci 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.activelyRecorded(
            clientRecordId = "Your client record ID",
            clientRecordVersion = 0L,
            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 işleminiz müşteri kaydı sürümünü içeriyorsa Health Connect, clientRecordVersion değerlerinde karşılaştırma kontrolleri gerçekleştirir. Eklenen verilerdeki sürüm, mevcut verilerdeki sürümden yüksekse upsert işlemi gerçekleşir. Aksi takdirde, işlem 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.activelyRecorded(
        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 değiştirmeniz 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ı sağlayabilirsiniz. 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, bu verilerin kaynağını ve kaynak cihaz meta verilerini doğru şekilde ilişkilendirmeniz gerekir. Bunun 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. bir 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: Desteklenen Device türlerinden birinde cihaz türü belirtmeniz gerekir.
  • device.manufacturer: Cihazın üreticisi (ör. "Fitbit").
  • device.model: Cihazın modeli (ör. "Charge 3").
  • device.udi: (İsteğe bağlı) Tıbbi cihazın Benzersiz Cihaz Tanımlayıcısı'nın (UDI) Cihaz Tanımlayıcısı (DI) kısmı. Gerekli izin ve gizlilik kuralları hakkında ayrıntılı bilgi için meta veri rehberine bakın.

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 uygulamak da iyi bir fikirdir. Geri çekilme ve yeniden deneme stratejilerinizi bir iş planlama mekanizmasına 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şhise yardımcı olmak için hataları günlüğe kaydetmeyi ve bildirmeyi unutmayın.

Verileri izlerken, uygulamanızın verileri yazma şekline bağlı olarak uygulayabileceğiniz birkaç öneri vardır.

Saat dilimi işleme

Zamana dayalı kayıtlar yazarken, kullanıcılar başka bölgelerdeyken yanlış zaman damgalarına yol açabileceğinden, varsayılan olarak zoneOffset.UTC'ye ofset ayarlamaktan kaçının. Bunun yerine, sapmayı 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.activelyRecorded(device = Device(type = Device.TYPE_WATCH)),
    )
    sampleTime = sampleTime.plus(Duration.ofMinutes(minutesBetweenSamples))
}
healthConnectClient.insertRecords(
    stepsRecords
)

Daha fazla bilgi için ZoneId ile ilgili belgelere bakın.

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ılabilir olduğ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ılı verilerin ayrıntı düzeyi: Verilerin ne sıklıkta örneklenmiş olduğu.
    • Örneğin, her 5 saniyede bir kalp atış hızı örneği yazın.
    • Her veri türü için aynı örnekleme hızı gerekmez. Adım sayısı verilerini her saniyede bir güncellemek yerine 60 saniyede bir gibi daha seyrek bir sıklıkta güncellemek daha avantajlıdır.
    • Daha yüksek örnekleme oranları, kullanıcılara sağlık ve fitness verilerine daha ayrıntılı ve ayrıntılı bir bakış sunabilir. Örnekleme hızı frekansları, 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.
  • İstekleri, yazma isteği başına en fazla 1.000 kayıt olacak şekilde parçalayın.
  • Görevlerin yalnızca cihaz boşta olduğunda ve pil seviyesi düşük olmadığında çalışmasını kısıtlayı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'ı kullanarak 15 dakikalık maksimum süre ve 5 dakikalık esnek aralıkla 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

Bu, egzersiz ve uyku gibi etkinliğe dayalı izleme veya beslenme gibi manuel kullanıcı girişi gerçekleştiren uygulamaları içerir. Bu kayıtlar, uygulama ön plandayken veya nadir durumlarda, günde birkaç kez kullanıldığında oluşturulur.

Uygulamanızın, etkinlik süresinin tamamı boyunca Health Connect'in çalışmasını sağlamadığı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ı takip edilen bir egzersiz oturumunu sonlandırdığında verileri senkronize edin.
  • Verileri daha sonra senkronize etmek için WorkManager simgesini kullanarak tek seferlik bir görev planlayın.

Yazma işleminin 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:

  1. Yazma sıklığı: Uygulamanızın yeni verileri Health Connect'e ne sıklıkta aktardığı. Yeni veriler kullanılabilir olduğ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.

  2. Yazılı 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, kalp atış hızı verileri için her dakika başına yeni bir HeartRateRecord oluşturmanız gerekir. Her kaydın, söz konusu dakikayı kapsayan bir başlangıç ve bitiş zamanı olur. Ayrıca, o dakika içinde kaydedilen tüm kalp atış hı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.activelyRecorded(
        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 Health Connect'e mümkün olduğunca sık yazmalıdır. 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.

Tablo 1: Veri yazma ile ilgili yönergeler

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

Dakikada bir

23:14 - 23:15 - 5 itme

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

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 aktif izleme veya beslenme gibi manuel kullanıcı girişi için bu kayıtlar, uygulama ön plandayken ya da nadir durumlarda günde birkaç kez kullanıldığında oluşturulur.

Uygulamanızın, etkinlik süresinin 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ı takip edilen 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:

Tablo 2: Egzersiz oturumu sırasında veri yazmayla ilgili yönergeler

Veri türü

Birim

Beklenen

Saygılarımızla,

Örnek

Adımlar

adım

Dakikada bir

Her saniyede

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

Her saniyede

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

Dakikada bir

Her saniyede

23:14-23:15 - 5 itme

23:16 - 23:17 - 22 anlık bildirim

23:17 - 23:18 - 8 anlık bildirim

CyclingPedalingCadence

devir/dk.

Dakikada bir

Her saniyede

23:14-23:15 - 65 devir/dk.

23:16 - 23:17 - 70 devir/dk.

23:17 - 23:18 - 68 devir/dk.

Güç

vat

Dakikada bir

Her saniyede

23:14-23:15 - 250 vat

23:16 - 23:17 - 255 vat

23:17 - 23:18 - 245 vat

Hız

km/dk

Dakikada bir

Her saniyede

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/m

Dakikada bir

Her saniyede

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

Her saniyede

23:14-23:15 - 20 Kalori

23:16 - 23:17 - 20 Kalori

23:17 - 23:18 - 25 Kalori

TotalCaloriesBurned

Kalori

Dakikada bir

Her saniyede

23:14-23:15 - 36 Kalori

23:16 - 23:17 - 36 Kalori

23:17 - 23:18 - 41 Kalori

ElevationGained

m

Dakikada bir

Her saniyede

20:36 - 20:37 - 3.048m

20:39 - 20:40 - 3.048m

23:23 - 23:24 - 9.144m

ExerciseRoutes

lat/lng/alt

Her 3-5 saniyede bir

Her saniyede

HeartRate

bpm

Dakikada 4 kez

Her saniyede

23:14-23:15 - 150 bpm

Tablo 3'te, uyku seansı sırasında veya sonrasında verilerin nasıl yazılacağı gösterilmektedir:

Tablo 3: Uyku oturumu sırasında veya sonrasında veri yazmayla ilgili yönergeler

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 okuyucularla 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.activelyRecorded(
        device = Device(type = Device.TYPE_WATCH)
    ),
    startZoneOffset = null,
    endZoneOffset = null,
)

val bikeSession = ExerciseSessionRecord(
    startTime = bikeStartTime,
    endTime = bikeEndTime,
    exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_BIKING,
    metadata = Metadata.activelyRecorded(
        device = Device(type = Device.TYPE_WATCH)
    ),
    startZoneOffset = null,
    endZoneOffset = null,
)

val runSession = ExerciseSessionRecord(
    startTime = runStartTime,
    endTime = runEndTime,
    exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_RUNNING,
    metadata = Metadata.activelyRecorded(
        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:

Tablo 1: Health Connect istisnaları ve önerilen en iyi uygulamalar
İstisna Açıklama Önerilen en iyi uygulama
IllegalStateException Aşağıdaki senaryolardan biri gerçekleşti:

  • Health Connect hizmeti kullanılamıyor.
  • İstek geçerli bir yapı değil. Örneğin, Instant nesnesinin timeRangeFilter için kullanıldığı, periyodik gruplar halinde bir toplu istek.

İstek göndermeden önce girişlerle ilgili olası sorunları ele alın. Tercihen, değişkenlere değer atayın veya bunları doğrudan isteklerinizde kullanmak yerine özel bir işlevde parametre olarak kullanın. Böylece hata işleme stratejilerini uygulayabilirsiniz.
IOException Diskten veri okuma ve diske veri yazma sırasında sorunlar oluşuyor. Bu sorunu önlemek için aşağıdaki önerileri uygulayabilirsiniz:

  • Kullanıcı girişlerini yedekleyin.
  • Toplu yazma işlemleri sırasında oluşan sorunları giderebilme Örneğin, işlemin sorunu aştığından emin olun ve kalan işlemleri gerçekleştirin.
  • İstek sorunlarını gidermek için yeniden deneme ve geri çekilme stratejilerini uygulayın.

RemoteException SDK'nın bağlandığı temel hizmette veya bu hizmetle iletişim kurulurken hatalar oluştu.

Örneğin, uygulamanız belirli bir uid ile kaydı silmeye çalışıyor. Ancak, temel hizmette check-in yapıldıktan sonra kayıt bulunmadığı anlaşılınca istisna oluşturulur.
Bu sorunu önlemek için aşağıdaki önerileri uygulayabilirsiniz:

  • Uygulamanızın veri deposu ile Health Connect arasında düzenli olarak senkronizasyon yapın.
  • İstek sorunlarını gidermek için yeniden deneme ve geri çekilme stratejilerini uygulayın.

SecurityException İstekler, verilmeyen izinler gerektirdiğinde sorunlar yaşanır. 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.