Health Connect ile Vitals deneyimleri geliştirme

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

Kullanıcıların yaşamsal değerlerini yöneten bir uygulama geliştirmek istiyorsanız Health Connect'i kullanarak şunları yapabilirsiniz:

  • Diğer uygulamalardan tansiyon, nabız ve vücut ısısı gibi hayati bulgu verilerini okuma
  • Uygulamanız veya bağlı cihazlar tarafından kaydedilen yaşamsal değer verilerini yazma
  • Yaşam değerleri verilerine dayalı olarak trendleri izleme ve sağlık analizleri sunma

Bu kılavuzda, izinler, okuma ve yazma iş akışları ile en iyi uygulamalar dahil olmak üzere yaşamsal değer veri türleriyle nasıl çalışılacağı açıklanmaktadır.

Genel bakış: Kapsamlı bir yaşamsal değerler takip uygulaması oluşturma

Aşağıdaki temel adımları uygulayarak Health Connect'i kullanan kapsamlı bir yaşamsal değerleri izleme deneyimi oluşturabilirsiniz:

  • Yaşam değerleri veri türleri için uygun izinleri isteme
  • BloodPressureRecord, HeartRateRecord ve diğer yaşamsal değer kayıtları gibi kayıtları kullanarak yaşamsal değer verilerini yazma.
  • Görüntüleme, analiz veya senkronizasyon için önemli verileri okuma.
  • Verileri verimli bir şekilde yazmak ve okumak için toplu işlem kullanma

Bu iş akışı, diğer Health Connect uygulamalarıyla birlikte çalışabilirliği sağlar ve kullanıcı tarafından kontrol edilen veri erişimini doğrular.

Başlamadan önce

Temel özellikler uygulanmadan önce:

Temel kavramlar

Health Connect'teki yaşamsal değer verileri, her biri belirli bir fizyolojik ölçüme karşılık gelen çeşitli kayıt türleriyle temsil edilir. Antrenman oturumlarının aksine, yaşamsal değerler genellikle belirli bir zaman noktasındaki veya aralığa dayalı veriler olarak kaydedilir.

Vitals veri türleri

Yaşam değerleri verileri, ayrı kayıt türleriyle temsil edilir. Yaygın türler şunlardır:

Veri türlerinin tam listesi için Health Connect veri türleri başlıklı makaleye bakın.

Geliştirme ile ilgili dikkat edilmesi gereken noktalar

Yaşam değerleri verileri hassas olabilir ve uygulamaların, sensörlerden veya kullanıcı girişlerinden gelen ölçümlere yanıt olarak veri yazması ya da bir arka uçtan veri senkronize etmesi gerekebilir. Yaşam değerleri verilerini işlemek için izinler çok önemlidir.

İzinler

Uygulamanız, yaşamsal belirti verilerini okumadan veya yazmadan önce ilgili Health Connect izinlerini istemelidir. Hayati bulgular için yaygın izinler arasında tansiyon, nabız, vücut ısısı, kan şekeri, oksijen doygunluğu ve solunum hızı yer alır. Bu alanlar/yollar aşağıdakileri içerir:

Aşağıda tansiyon, nabız ve vücut sıcaklığı için izin isteme örneği verilmiştir:

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(BloodPressureRecord::class),
        HealthPermission.getWritePermission(BloodPressureRecord::class),
        HealthPermission.getReadPermission(HeartRateRecord::class),
        HealthPermission.getWritePermission(HeartRateRecord::class),
        HealthPermission.getReadPermission(BodyTemperatureRecord::class),
        HealthPermission.getWritePermission(BodyTemperatureRecord::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.

İzin istemek için checkPermissionsAndRun işlevini çağırın:

if (!granted.containsAll(permissions)) {
    // Check if required permissions are not granted, and return
    return emptySet()
}
// Permissions already granted; proceed with inserting or reading data

Yalnızca tek bir veri türü (ör. tansiyon) için izin istemeniz gerekiyorsa izin setinize yalnızca bu veri türünü ekleyin:

Tansiyon verilerine erişim aşağıdaki izinlerle korunur:

  • android.permission.health.READ_BLOOD_PRESSURE
  • android.permission.health.WRITE_BLOOD_PRESSURE

Uygulamanıza tansiyon özelliğini eklemek için öncelikle BloodPressureRecord veri türü için izin isteyin.

Tansiyon verilerini yazabilmek için beyan etmeniz gereken izin şudur:

<application>
  <uses-permission
android:name="android.permission.health.WRITE_BLOOD_PRESSURE" />
...
</application>

Tansiyonu okumak için aşağıdaki izinleri istemeniz gerekir:

<application>
  <uses-permission
android:name="android.permission.health.READ_BLOOD_PRESSURE" />
...
</application>

Hayati bulgu verilerini yazma

Bu bölümde, yaşamsal belirti verilerinin Health Connect'e nasıl yazılacağı açıklanmaktadır. Yaşam belirtisi verileri genellikle ayrı kayıtlar olarak yazılır. Bir sensörden veya arka uçtan senkronizasyon gibi aynı anda birden fazla kayıt yazıyorsanız toplu işlem kullanın.

BloodPressureRecord yazma örneği:

suspend fun writeBloodPressureRecord(healthConnectClient: HealthConnectClient) {
    val record = BloodPressureRecord(
        time = Instant.now(),
        zoneOffset = ZoneOffset.UTC,
        systolic = Pressure.millimetersOfMercury(120.0),
        diastolic = Pressure.millimetersOfMercury(80.0),
        bodyPosition = BloodPressureRecord.BODY_POSITION_SITTING_DOWN,
        measurementLocation = BloodPressureRecord.MEASUREMENT_LOCATION_LEFT_WRIST
    )
    healthConnectClient.insertRecords(listOf(record))
}

Toplu yazma

Uygulamanızın bağlı bir cihazdan veya arka uç hizmetinden veri senkronizasyonu gibi birden fazla veri noktası yazması gerekiyorsa verimliliği artırmak ve pil tüketimini azaltmak için yazma işlemlerini toplu olarak yapmanız gerekir. Health Connect, tek bir yazma isteğinde en fazla 1.000 kaydı işleyebilir.

Aşağıdaki kodda, birden fazla kaydın aynı anda nasıl toplu olarak yazılacağı gösterilmektedir:

suspend fun writeBatchRecords(healthConnectClient: HealthConnectClient) {
    val bloodPressureRecord = BloodPressureRecord(
        time = Instant.now(),
        zoneOffset = ZoneOffset.UTC,
        systolic = Pressure.millimetersOfMercury(120.0),
        diastolic = Pressure.millimetersOfMercury(80.0),
        bodyPosition = BloodPressureRecord.BODY_POSITION_SITTING_DOWN,
        measurementLocation = BloodPressureRecord.MEASUREMENT_LOCATION_LEFT_WRIST
    )
    val heartRateRecord = HeartRateRecord(
        startTime = Instant.now().minusSeconds(60),
        startZoneOffset = ZoneOffset.UTC,
        endTime = Instant.now(),
        endZoneOffset = ZoneOffset.UTC,
        samples = listOf(HeartRateRecord.Sample(time = Instant.now().minusSeconds(30), beatsPerMinute = 80))
    )
    healthConnectClient.insertRecords(listOf(bloodPressureRecord, heartRateRecord))
}

Yaşam değerleri verilerini okuma

Uygulamalar, ölçümleri görüntülemek, trendleri analiz etmek veya verileri harici bir sunucuyla senkronize etmek için önemli verileri okuyabilir. Temel değerleri okumak için belirli kayıt türüne sahip bir ReadRecordsRequest kullanın ve zaman aralığına göre filtreleyin.

BloodPressureRecord verilerini okuma örneği:

suspend fun readBloodPressureRecords(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant
) {
    val response = healthConnectClient.readRecords(
        ReadRecordsRequest(
            recordType = BloodPressureRecord::class,
            timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
        )
    )

    for (record in response.records) {
        // Process each blood pressure record
        val systolic = record.systolic
        val diastolic = record.diastolic
    }
}

Hayati belirti verilerini bir arka uç sunucusuyla senkronize etmeniz veya uygulamanızın veri deposunu Health Connect ile güncel tutmanız gerekiyorsa ChangeLogs'u kullanın. Bu sayede, belirli bir zaman noktasından sonra eklenen, güncellenen veya silinen kayıtların listesini alabilirsiniz. Bu, değişiklikleri manuel olarak izlemekten veya tüm verileri tekrar tekrar okumaktan daha verimlidir. Daha fazla bilgi için Verileri Health Connect ile senkronize etme başlıklı makaleyi inceleyin.

En iyi uygulamalar

Veri güvenilirliğini ve kullanıcı deneyimini iyileştirmek için aşağıdaki yönergeleri uygulayın:

  • Yazma isteklerini toplu olarak gönderme: Giriş/çıkış ek yükünü azaltmak ve pil ömrünü korumak için her veri noktasını ayrı ayrı yazmak yerine veri noktalarını 1.000 kayda kadar toplu olarak tek bir insertRecords çağrısında gruplandırın.
  • Canlı takip sırasında sık sık yazma: Sensörlerden (ör. sürekli glikoz monitörleri veya nabız ölçerler) sık sık güncelleme almak için verileri 15 dakikaya kadar aralıklarla gruplar halinde yazarak anlık güncellemeler ile pil verimliliğini dengeleyin.
  • Arka plan senkronizasyonları için WorkManager'ı kullanın: Yardımcı cihazdan veya arka uç hizmetinden veri senkronizasyonu gibi ertelenen yazma işlemleri için WorkManager kullanın. Toplu yazma işlemleri için 15 dakikalık bir aralık hedefleyin.
  • Yinelenen veriler yazmaktan kaçınma: İstemci kimliklerini kullanma: Kayıt oluştururken metadata.clientRecordId ayarlayın. Health Connect, benzersiz kayıtları tanımlamak için bu bilgiyi kullanır. Zaten mevcut olan bir clientRecordId ile kayıt yazmaya çalışırsanız Health Connect, yeni bir kayıt oluşturmak yerine kopyayı yok sayar veya mevcut kaydı günceller. metadata.clientRecordId ayarlamak, senkronizasyon yeniden denemeleri veya uygulamanın yeniden yüklenmesi sırasında yinelenenleri önlemenin en etkili yoludur.
    val record = StepsRecord(
        count = 100,
        startTime = startTime,
        endTime = endTime,
        startZoneOffset = ZoneOffset.UTC,
        endZoneOffset = ZoneOffset.UTC,
        metadata = Metadata(
            // Use a unique ID from your own database
            clientRecordId = "daily_steps_2023_10_27_user_123"
        )
    )
  • Mevcut verileri kontrol edin: Verileri senkronize etmeden önce, senkronizasyon zaman aralığındaki kayıtlar için Health Connect'i sorgulayarak uygulamanızdaki verilerin zaten mevcut olup olmadığını kontrol edin. Böylece, yinelenen verileri veya daha yeni verilerin üzerine yazılmasını önleyebilirsiniz.
  • İzin için net gerekçeler sunun: Uygulamanızın sağlık verilerine neden erişmesi gerektiğini açıklamak için Permission.createIntent akışını kullanın. Örneğin: "Tansiyonunuzda gözlemlenen değişimleri izlemek ve analizler sunmak için."
  • Zaman damgalarını ölçümlerle uyumlu hale getirin: Kayıt zaman damgalarının, ölçümlerin ne zaman yapıldığını doğru şekilde yansıttığını doğrulayın. HeartRateRecord gibi aralık verileri için startTime ve endTime değerlerinin doğru olduğunu doğrulayın.

Test

Verilerin doğruluğunu ve yüksek kaliteli bir kullanıcı deneyimini doğrulamak için bu test stratejilerini uygulayın ve resmi En önemli kullanım alanlarını test etme belgelerine bakın.

Doğrulama araçları

  • Health Connect Araç Kutusu: Kayıtları manuel olarak incelemek, test verilerini silmek ve veritabanındaki değişiklikleri simüle etmek için bu tamamlayıcı uygulamayı kullanın. Kayıtlarınızın doğru şekilde saklandığını doğrulamanın en iyi yolu budur.
  • FakeHealthConnectClient ile birim testi: Uygulamanızın, izin iptali veya API istisnaları gibi uç durumları fiziksel bir cihaza ihtiyaç duymadan nasıl işlediğini doğrulamak için test kitaplığını kullanın.

Kalite kontrol listesi

Tipik mimari

Önemli verilerin uygulanması genellikle şunları içerir:

Bileşen Yönetir
Vitals denetleyicisi Sensör/giriş okuma
Toplu iş mantığı
Kod deposu katmanı (Health Connect işlemlerini sarmalar:) Yaşam değerleri kayıtlarını ekleme
Yaşam değerleri kayıtlarını okuma
Kullanıcı arayüzü katmanı (ekranlar): Canlı ölçümler
Geçmiş veriler
Grafikler ve trendler

Sorun giderme

Belirti Olası neden Çözünürlük
Eksik veri türleri (ör. tansiyon) Yazma izinleri eksik veya zaman filtreleri yanlış. İlgili veri türü iznini talep ettiğinizden ve kullanıcının bu izni verdiğinden emin olun. ReadRecordsRequest öğenizin, ölçüm zamanını kapsayan bir TimeRangeFilter kullandığını doğrulayın. İzinler'i inceleyin.
Yinelenen kayıtlar görünüyor clientRecordId eksik. Her kaydın Metadata alanına benzersiz bir clientRecordId atayın. Bu sayede Health Connect, senkronizasyon yeniden denemesi sırasında aynı veriler iki kez yazılırsa tekilleştirme yapabilir. En iyi uygulamalar bölümüne bakın.
Kayıtlar yazılamıyor Birimler yanlış veya değerler geçerli aralığın dışında. Health Connect, kayıt değerlerini doğrular. Örneğin, tansiyon değerleri fizyolojik olarak makul bir aralıkta olmalıdır. Geçerli aralıklar ve birimler için veri türü belgelerini inceleyin.

Sık kullanılan hata ayıklama adımları

İzin durumunu kontrol edin. Okuma veya yazma işlemi yapmadan önce her zaman getPermissionStatus() yöntemini çağırın. Kullanıcılar, sistem ayarlarından izinleri istedikleri zaman iptal edebilir.