Verileri yazma

Bu kılavuz, Health Connect 1.1.0-alpha12 veya sonraki sürümlerle uyumludur.

Bu kılavuzda, Health Connect'te veri yazma veya güncelleme süreci ele alınmaktadır.

Sıfır değerlerini 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ğerleri yazmayın. Bu gibi durumlarda, yanıltıcı verilerden kaçınmak için kaydı atlayın.

Veri yapısını ayarlama

Veri yazmadan önce kayıtları oluşturmamız gerekir. 50'den fazla veri türü için her birinin kendine özgü yapıları vardır. Kullanılabilir veri türleri hakkında daha fazla bilgi için Jetpack referansına bakın.

Temel kayıtlar

Health Connect'teki Adım veri türü, kullanıcının ölçümler arasında attığı adım sayısını kaydeder. Adım sayıları; 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 örnek olarak geniş ve kapsamlı Beslenme veri türü verilebilir. Toplam karbonhidratlardan vitaminlere kadar çok çeşitli isteğe bağlı besin alanları içerir. Her veri noktası, bir öğün veya yiyecek maddesi kapsamında tüketilmiş olabilecek besinleri temsil eder.

Bu veri türünde tüm besinler Kütle birimleriyle, energy ise Enerji birimiyle temsil edilir.

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 verisi listesi depolayabilir. Ölçümler arasında algılanan bir dizi nabız örneğini yakalayan Nabız veri türü buna örnek olarak verilebilir.

Bu veri türünde samples parametresi, nabız örnekleri listesiyle temsil edilir. Her örnekte bir beatsPerMinute değeri ve bir time değeri bulunur.

Aşağıdaki örnekte, nabı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

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(HeartRateRecord::class),
        HealthPermission.getWritePermission(HeartRateRecord::class),
        HealthPermission.getReadPermission(StepsRecord::class),
        HealthPermission.getWritePermission(StepsRecord::class)
    )
Uygulamanızın gerekli izinlere sahip olup olmadığını görmek için 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.") }
    }
}
Kullanıcılar istedikleri zaman izin verebildikleri veya izinleri iptal edebildikleri için uygulamanızın, izinleri kullanmadan önce her seferinde kontrol etmesi ve iznin kaybedildiği senaryoları yönetmesi gerekir.

Verileri yazma

Health Connect'teki yaygın iş akışlarından biri veri yazmaktır. Kayıt eklemek için insertRecords simgesini kullanın.

Aşağıdaki örnekte, adım sayılarını ekleyerek verilerin 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üncelle

Bir veya daha fazla kaydı değiştirmeniz gerekiyorsa, özellikle de 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

Verileri güncellerken gerekli olduğundan öncelikle Metadata sınıfını incelemeniz önerilir. Health Connect'te oluşturulan her Record, bir metadata alanına sahiptir. Aşağıdaki özellikler senkronizasyonla ilgilidir:

Özellikler Açıklama
id Health Connect'teki her Record, benzersiz bir id değerine sahiptir.
Health Connect, yeni bir kayıt eklerken bu alanı otomatik olarak doldurur.
lastModifiedTime Her Record, kaydın en son değiştirildiği zamanı da takip eder.
Health Connect bu bilgiyi otomatik olarak doldurur.
clientRecordId Her Record, uygulama veri deponuzda referans olarak kullanılmak üzere kendisiyle ilişkili benzersiz bir kimliğe sahip olabilir.
Uygulamanız bu değeri sağlar.
clientRecordVersion Bir kayıtta clientRecordId varsa verilerin uygulama veri deponuzdaki sürümle senkronize kalmasını sağlamak için clientRecordVersion kullanılabilir.
Uygulamanız bu değeri sağlar.

Okuduktan sonra 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 yöntemini çağırın.

Aşağıdaki örnekte, verilerin nasıl güncelleneceği gösterilmektedir. Bu amaçla, her kaydın bölge 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 Kayıt Kimliği aracılığıyla ekleme/güncelleme

İsteğe bağlı Müşteri Kayıt Kimliği ve Müşteri Kayıt Sürümü değerlerini kullanıyorsanız updateRecords yerine insertRecords kullanmanızı öneririz.

insertRecords işlevi, verileri güncelleme ve ekleme özelliğine sahiptir. Veriler, belirtilen istemci kayıt kimlikleri grubuna göre Health Connect'te mevcutsa ü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 alınan verilerde upsert işleminin nasıl gerçekleştirileceği 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 sürecinizde istemci kayıt 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 daha 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şturma özelliğini eklemek için sürüm oluşturma mantığınıza göre Metadata.clientRecordVersion özelliğine 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)
    )
)

Upsert'ler, değişiklik olduğunda version değerini otomatik olarak artırmaz. Bu sayede, verilerin üzerine yazılmasıyla ilgili beklenmedik durumlar önlenir. Bu nedenle, daha yüksek bir değeri manuel olarak girmeniz 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, verilerin kaynağını ve kaynak cihaz meta verilerini doğru şekilde belirtmeniz beklenir. Bunun için her yazılı kayıtla ilgili aşağıdaki meta verileri sağlamanız gerekir:

  • recordingMethod: Otomatik veya manuel olarak kaydedilen verilerde, kayıt yönteminin kaydedilen etkinlik türünü yansıtacak şekilde güncellenmesini bekleriz:
    • RECORDING_METHOD_AUTOMATICALLY_RECORDED: Veriler otomatik olarak kaydedildiyse (ör. fitness bilekliği, kullanıcının koşuya çıktığını otomatik olarak algıladıysa)
    • RECORDING_METHOD_ACTIVELY_RECORDED: Kullanıcı, giyilebilir cihazında bisiklet sürme gibi yeni bir etkinliğe başladıysa
    • RECORDING_METHOD_MANUAL_ENTRY: Kullanıcı verileri manuel olarak girdiyse.
  • device.type: Desteklenen Device türlerinden bir 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ı (DI) kısmı. Gerekli izin ve gizlilik kuralları hakkında ayrıntılı bilgi için meta veri kılavuzuna 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 anlamaları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 sistem hatası gibi yazma istisnalarını işleyen bir mantık uygulamak da iyi bir fikirdir. Bekleme 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ı olması 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 yönetimi

Zamana dayalı kayıtlar yazarken varsayılan olarak zoneOffset.UTC değerini ayarlamaktan kaçının. Bu, kullanıcılar başka bölgelerdeyken yanlış zaman damgalarına neden olabilir. Bunun yerine, farkı 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 göz atı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, depolama yükünü azaltmaya yardımcı olurken tutarlı ve doğru veriler elde etmenizi sağlar. 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 mevcut 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 örneklendiği.
    • Örneğin, her 5 saniyede bir nabız örnekleri yazın.
    • Her veri türü için aynı örnek hızı gerekmez. Adım sayısı verilerini her saniye güncellemenin, 60 saniyede bir gibi daha seyrek bir sıklıkta güncellemeye kıyasla pek bir avantajı yoktur.
    • Daha yüksek örnek 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. Örnek hızı frekansları, ayrıntı ve performans arasında bir denge kurmalıdır.

Ek kurallar

Veri yazarken aşağıdaki kurallara uyun:

  • Her senkronizasyonda yalnızca yeni verileri ve son senkronizasyondan sonra değiştirilen güncellenmiş verileri yazın.
  • İstekleri, yazma isteği başına en fazla 1.000 kayıt olacak şekilde parçalara ayırın.
  • Görevleri yalnızca cihaz boştayken ve pil seviyesi düşük değilken çalışacak şekilde kısıtlayın.
  • Arka plan görevleri için WorkManager'ı kullanarak maksimum 15 dakikalık bir süreyle periyodik görevler planlayın.

Aşağıdaki kod, maksimum 15 dakikalık bir süre ve 5 dakikalık esnek bir aralıkla periyodik arka plan görevlerini planlamak için WorkManager kitaplığını kullanır. 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()

Aktivite izleme

Egzersiz ve uyku gibi etkinliğe dayalı takip yapan veya beslenme gibi manuel kullanıcı girişi gerektiren uygulamalar bu kapsama girer. Bu kayıtlar, uygulama ön plandayken veya nadiren günde birkaç kez kullanıldığında oluşturulur.

Uygulamanızın, Health Connect'i etkinliğin tamamı boyunca çalıştırmadığını doğrulayın.

Veriler, Health Connect'e iki yöntemden biriyle yazılmalıdır:

  • 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.

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, depolama yükünü azaltmaya yardımcı olurken tutarlı ve doğru veriler elde etmenizi sağlar. Veri çözünürlüğü iki şeyi kapsar:

  1. Yazma sıklığı: Uygulamanızın Health Connect'e ne sıklıkta yeni veri gönderdiği. Yeni veriler mevcut 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 örneklendiği. Örneğin, her 5 saniyede bir nabız örnekleri yazın. Her veri türü için aynı örnek hızı gerekmez. Adım sayısı verilerini her saniye güncellemenin, 60 saniyede bir gibi daha seyrek bir sıklıkta güncellemeye kıyasla pek bir avantajı yoktur. Ancak daha yüksek örnek 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. Örnek hızı frekansları, ayrıntı ve performans arasında bir denge kurmalıdır.

Seri 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 yeni bir HeartRateRecord oluşturmanız gerekir. Her kayıtta, o dakikayı kapsayan bir başlangıç ve bitiş zamanı olur ve o dakika içinde yakalanan tüm nabız örnekleri yer alır.

Health Connect ile düzenli senkronizasyonlar sırasında (ör. 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 verileri sorgulama ve işleme performansı artar.

Aşağıdaki örnekte, birden fazla örnek içeren tek dakikalık bir HeartRateRecord oluşturma işlemi 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ım sayısı gibi sürekli olarak toplanan veriler için uygulamanız, yeni veriler mevcut 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 push

23:16 - 23:17 - 22 itme

23:17 - 23:18 - 8 itme

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

06:11:15 - 55 nabız/dk.

06:11:30 - 56 nabız/dk.

06:11:45 - 56 nabız/dk.

06:12:00 - 55 nabız/dk.

HeartRateVariabilityRmssd

ms

Dakikada bir

06: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 oturumunun 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 veya nadir durumlarda günde birkaç kez kullanıldığında oluşturulur.

Uygulamanızın, Health Connect'i etkinliğin tamamı boyunca çalıştırmadığını doğrulayın.

Veriler, Health Connect'e iki yöntemden biriyle yazılmalıdır:

  • 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 seansları

Uygulamanız en azından Tablo 2'deki Beklenen sütununda yer alan yönergeleri uygulamalıdır. Mümkün olduğunda En iyi sütunundaki talimatları uygulayın.

Aşağıdaki tabloda, egzersiz sırasında verilerin nasıl yazılacağı gösterilmektedir:

Tablo 2: Egzersiz seansı sırasında veri yazma ile ilgili yönergeler

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

Dakikada bir

Saniyede bir

23:14-23:15 - 5 itme

23:16 - 23:17 - 22 itme

23:17 - 23:18 - 8 itme

CyclingPedalingCadence

devir/dk.

Dakikada bir

Saniyede bir

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

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

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

enlem/boylam/yükseklik

3-5 saniyede bir

Saniyede bir

HeartRate

bpm

Dakikada 4 kez

Saniyede bir

23:14-23:15 - 150 nabız

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 yazma kılavuzu

Veri türü

Birim

Beklenen örnekler

Örnek

Uyku Aşamaları

sürecin

Uyku aşaması başına ayrıntılı zaman dilimi

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)

06:11 - 60 nabız/dk.

OxygenSaturation

%

Tek günlük değer (sabah ilk iş olarak beklenir)

6:11 - %95,208

Çoklu spor etkinlikleri

Bu yaklaşım, mevcut veri türlerini ve yapılarını kullanır. Ayrıca mevcut Health Connect uygulamaları ve veri okuyucularıyla uyumluluğu doğrular. Bu, fitness platformları tarafından yaygın olarak kullanılan bir yaklaşımdır.

Ayrıca yüzme, bisiklet sürme ve koşu 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 yakalayıp uygun şekilde işlemelidir.

HealthConnectClient üzerindeki her yöntem, oluşturulabilecek istisnaları listeler. 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, timeRangeFilter için bir Instant nesnesinin kullanıldığı periyodik gruplardaki bir toplu istek.

İstek göndermeden önce girişlerle ilgili olası sorunları giderin. Hata işleme stratejilerini uygulayabilmek için değişkenleri doğrudan isteklerinizde kullanmak yerine değişkenlere değer atamanız veya bunları özel bir işlevde parametre olarak kullanmanız önerilir.
IOException Diskten veri okuma ve diske veri yazma sırasında sorunlarla karşılaşılıyor. Bu sorunu önlemek için bazı öneriler:

  • Kullanıcı girişlerini yedekleyin.
  • Toplu yazma işlemleri sırasında ortaya çıkan sorunları çözebilme Örneğin, sürecin sorunu aşmasını sağlayın ve kalan işlemleri gerçekleştirin.
  • İstek sorunlarını gidermek için yeniden deneme ve bekleme stratejileri 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 değerine sahip bir kaydı silmeye çalışıyor. Ancak uygulama, temel hizmeti kontrol ettikten sonra kaydın mevcut olmadığını tespit ettiğinde istisna oluşturulur.
Bu sorunu önlemek için bazı öneriler:

  • Uygulamanızın veri deposu ile Health Connect arasında düzenli senkronizasyonlar gerçekleştirin.
  • İstek sorunlarını gidermek için yeniden deneme ve bekleme stratejileri uygulayın.

SecurityException İstekler, verilmeyen izinler gerektirdiğinde sorunlarla karşılaşılır. Bu sorunu önlemek için yayınlanan 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.