Health Connect ile Vitals deneyimleri geliştirme

Kullanıcıların hayati bulgularını yöneten bir uygulama oluşturmak istiyorsanız Health Connect'i kullanarak şunları yapabilirsiniz:

  • Diğer uygulamalardan tansiyon, nabız ve vücut ısısı gibi hayati bulgularla ilgili verileri okuma
  • Uygulamanız veya bağlı cihazlar tarafından kaydedilen hayati bulgular verilerini yazma
  • Trendleri izleme ve hayati bulgular verilerine dayalı sağlık analizleri sağlama

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

Genel bakış: Kapsamlı bir Vitals izleyici oluşturma

Aşağıdaki temel adımları uygulayarak Health Connect'i kullanarak kapsamlı bir hayati bulgular izleme deneyimi oluşturabilirsiniz:

  • Hayati veri türleri için uygun izinleri isteme
  • BloodPressureRecord, HeartRateRecord ve diğer hayati kayıtlar gibi kayıtları kullanarak hayati verileri yazma
  • Görüntüleme, analiz veya senkronizasyon için vitals verilerini okuma.
  • Verimli veri yazma ve okuma için gruplandırma kullanma.

Bu iş akışı, diğer Health Connect uygulamalarıyla birlikte çalışabilmeyi sağlar ve kullanıcı kontrollü veri erişimini doğrular.

Başlamadan önce

Vitals özelliklerini uygulamadan önce:

Temel kavramlar

Health Connect'teki hayati bulgular verileri, her biri belirli bir fizyolojik ölçüme karşılık gelen çeşitli kayıt türleriyle temsil edilir. Antrenman seanslarının aksine, hayati bulgular genellikle belirli bir zamandaki veya aralığa dayalı veriler olarak kaydedilir.

Vitals veri türleri

Vitals 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ı makaleyi inceleyin.

Geliştirme ile ilgili dikkat edilmesi gereken hususlar

Vitals verileri hassas olabilir ve uygulamaların, sensörlerden gelen ölçümlere veya kullanıcı girişine yanıt olarak veri yazması ya da arka uçtaki verileri senkronize etmesi gerekebilir. Hayati verilerin işlenmesi için izinler çok önemlidir.

İzinler

Uygulamanız, hayati bulgular 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 destek, şunları içerir:

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

İstemci örneği oluşturduktan sonra uygulamanızın kullanıcıdan izin istemesi gerekir. Kullanıcıların izinleri istedikleri zaman vermesine veya reddetmesine izin verilmelidir.

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.

// Create a set of permissions for required data types
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ıza gerekli izinlerin verilip verilmediğini görmek için getGrantedPermissions aracını 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.

// Create the permissions launcher
val requestPermissionActivityContract = PermissionController.createRequestPermissionResultContract()

val requestPermissions = registerForActivityResult(requestPermissionActivityContract) { granted ->
  if (granted.containsAll(PERMISSIONS)) {
    // Permissions successfully granted
  } else {
    // Lack of required permissions
  }
}

suspend fun checkPermissionsAndRun(healthConnectClient: HealthConnectClient) {
  val granted = healthConnectClient.permissionController.getGrantedPermissions()
  if (granted.containsAll(PERMISSIONS)) {
    // Permissions already granted; proceed with inserting or reading data
  } else {
    requestPermissions.launch(PERMISSIONS)
  }
}

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.

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

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

Yalnızca kan basıncı gibi tek bir veri türü için izin istemeniz gerekiyorsa izin kümenize yalnızca bu veri türünü ekleyin:

Tansiyona erişim aşağıdaki izinlerle korunur:

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

Uygulamanıza tansiyon özelliği eklemek için öncelikle BloodPressureRecord veri türüyle ilgili izinleri isteyerek başlayın.

Kan basıncı yazabilmek için bildirmeniz gereken izin aşağıda verilmiştir:

<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 bulguları yazma

Bu bölümde, hayati bulgular verilerinin Health Connect'e nasıl yazılacağı açıklanmaktadır. Vitals verileri genellikle ayrı kayıtlar olarak yazılır. Bir sensör veya arka uçtan senkronizasyon gibi aynı anda birden fazla kayıt yazıyorsanız gruplandırmayı 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 gelen verileri senkronize etmek 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 1.000'e kadar 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))
}

Hayati bulgu verilerini okuma

Uygulamalar, ölçümleri göstermek, trendleri analiz etmek veya verileri harici bir sunucuyla senkronize etmek için hayati verileri okuyabilir. Yaşamsal belirtileri okumak için belirli kayıt türüyle ReadRecordsRequest kullanın ve bir 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 bulgularla ilgili verileri 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 yöntem, belirli bir zamandan beri eklenen, güncellenen veya silinen kayıtların listesini almanıza olanak tanır. 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önergelere uyun:

  • Yazma sıklığı ve toplu işleme: Giriş/çıkış ek yükünü azaltmak ve pil ömrünü korumak için veri noktalarını tek tek yazmak yerine 1.000 kayda kadar toplu işleme ile tek bir insertRecords çağrısında gruplandırın.
    • Canlı İzleme: Sensörlerden (ör. sürekli glikoz ölçerler 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ği arasında denge kurun.
    • Arka plan senkronizasyonu: Yardımcı cihaz veya arka uç hizmetinden veri senkronize etme gibi ertelenmiş 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çının: İstemci kimliklerini kullanın Kayıt oluştururken metadata.clientRecordId değerini 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, yinelenen kaydı yoksayar veya yeni bir kayıt oluşturmak yerine mevcut kaydı günceller. Senkronizasyon yeniden denemeleri veya uygulama yeniden yüklemeleri sırasında yinelenen öğeleri önlemenin en etkili yolu metadata.clientRecordId ayarlamaktır.

    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,
        metadata = Metadata(
            // Use a unique ID from your own database
            clientRecordId = "bp_20240101_user123"
        )
    )
  • Mevcut verileri kontrol edin: Verileri senkronize etmeden önce, uygulamanızdaki verilerin zaten mevcut olup olmadığını görmek için senkronizasyon zaman aralığındaki kayıtlar için Health Connect'e sorgu gönderin. Böylece, yinelenen verileri veya yeni verilerin üzerine yazılmasını önleyebilirsiniz.

  • İzin için net gerekçeler sunun: Uygulamanızın neden sağlık verilerine erişmesi gerektiğini açıklamak için Permission.createIntent akışını kullanın. Örneğin, "Tansiyon trendlerinizi izlemek ve analizler sunmak için".

  • Zaman damgalarını ölçümlerle eşleştirin: 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ı deneyimi sağlamak için aşağıdaki test stratejilerini uygulayın ve resmi En sık kullanılan test senaryoları dokümanına bakın.

Doğrulama araçları

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

Kalite kontrol listesi

Tipik mimari

Hayati bulguların uygulanması genellikle şunları içerir:

Bileşen Yönetir
Vitals denetleyicisi Sensör/Giriş okuma
Toplu işleme mantığı
Depo katmanı (Health Connect işlemlerini kapsar): Hayati verileri ekleme
Hayati verileri okuma
Kullanıcı Arayüzü Katmanı (Ekranlar): Anlık okumalar
Geçmiş veriler
Grafikler ve trendler

Sorun giderme

Belirti Olası neden Çözünürlük
Eksik veri türleri (örneğin, tansiyon) Yazma izinlerinin eksik olması veya zaman filtrelerinin yanlış olması. İlgili veri türü iznini istediğ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 başlıklı makaleyi inceleyin.
Yinelenen kayıtlar gösteriliyor clientRecordId eksik. Her kaydın Metadata bölümünde benzersiz bir clientRecordId atayın. Bu sayede, senkronizasyon yeniden denemesi sırasında aynı veriler iki kez yazılırsa Health Connect, verileri tekilleştirebilir. En iyi uygulamalar bölümüne bakın.
Kayıtlar yazılamıyor Yanlış birimler veya geçerli aralığın dışındaki değerler. 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 kontrol edin.

Sık karşılaşılan hata ayıklama adımları

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