Tıbbi verileri yazma

Bu kılavuz, Health Connect 1.1.0-beta02 sürümüyle uyumludur.

Health Connect'te Kişisel Sağlık Kayıtları'nı (PHR) kullanarak tıbbi veriler yazmak için aşağıdaki adımları uygulayın:

  1. Özellik kullanılabilirliğini kontrol etme
  2. Yazma izni isteme
  3. Veri kaynağı oluşturma (MedicalDataSource)
  4. Tıbbi kaynak yazma (MedicalResource)

Özellik kullanılabilirliği

Kullanıcının cihazının Health Connect'te PHR'yi destekleyip desteklemediğini belirlemek için istemcide FEATURE_PERSONAL_HEALTH_RECORD'nin kullanılabilirliğini kontrol edin:

if (healthConnectClient
     .features
     .getFeatureStatus(
       HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD
     ) == HealthConnectFeatures.FEATURE_STATUS_AVAILABLE) {

  // Feature is available
} else {
  // Feature isn't available
}

Daha fazla bilgi için Özellik kullanılabilirliğini kontrol etme başlıklı makaleyi inceleyin.

Gerekli izinler

Tıbbi verileri yazma işlemi aşağıdaki izinle korunur:

  • android.permission.health.WRITE_MEDICAL_DATA

Aşağıdaki izinleri uygulamanız için Play Console'da ve uygulamanızın manifest dosyasında beyan edin:

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

Cihazlarınızda ve uygulamalarınızda kullanmak istediğiniz tüm uygun izinleri belirtme sorumluluğu size aittir. Ayrıca, her iznin kullanımdan önce kullanıcı tarafından verildiğini kontrol etmeniz gerekir.

Kullanıcıdan izin isteme

Uygulamanızın, istemci örneği oluşturduktan sonra kullanıcıdan izin istemesi gerekir. Kullanıcıların diledikleri zaman izin vermesine veya reddetmesine izin verilmelidir.

Bunun için gerekli veri türleri için bir dizi izin oluşturun. Öncelikle, gruptaki izinlerin Android manifest dosyanızda beyan edildiğinden emin olun.

// Create a set of permissions for required data types
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_WRITE_MEDICAL_DATA

val PERMISSIONS =
    setOf(
       PERMISSION_WRITE_MEDICAL_DATA
)

Uygulamanıza gerekli izinlerin verilip verilmediğini görmek için getGrantedPermissions'u kullanın. Aksi takdirde bu izinleri istemek için createRequestPermissionResultContract değerini kullanın. Health Connect izinleri ekranı gösterilir.

// 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 verip iptal edebileceğinden, uygulamanızın izinleri düzenli olarak kontrol etmesi ve iznin kaybedildiği senaryoları ele alması gerekir.

Veri Kaynakları

Health Connect'teki MedicalDataSource, kullanıcılara yönelik bir veri kaynağını (ör. sağlık kuruluşu, hastane veya API) temsil eder.

Health Connect'te depolanan tıbbi kayıtlar MedicalDataSource olarak düzenlenir. Bu sayede, API'ler veya sağlık sistemleri gibi farklı kaynaklardan gelen aynı kişiye ait tıbbi kayıtlar birbirinden ayrılabilir.

Tüm kayıtlar aynı kaynaktan geliyorsa yazma uygulamasının yalnızca bir MedicalDataSource oluşturması gerekir. Kayıtlar birden fazla kaynaktan geliyorsa bu veriler uyumlu hale getirilirse ve tüm kayıtlar FHIR kaynak türü ile FHIR kaynak kimliğinin benzersiz bir kombinasyonuna sahipse uygulama yine de tek bir MedicalDataSource oluşturabilir. Aksi takdirde her veri kaynağı için bir MedicalDataSource oluşturulmalıdır.

Tüm tıbbi kayıtlar bir MedicalDataSource ile ilişkilendirilmelidir. Bu nedenle, kaynaklar yazılmadan önce bu öğe oluşturulmalıdır.

MedicalDataSource'ün özellikleri:

  • Görünen ad (zorunlu): Veri kaynağının kullanıcılara yönelik görünen adı. Yazma uygulaması başına benzersiz şekilde tanımlanır.
  • FHIR Ana URI'si (zorunlu): FHIR sunucusundan gelen veriler için bu, FHIR ana URL'si olmalıdır (örneğin, https://example.com/fhir/). Aynı FHIR ana URL'siyle birden fazla veri kaynağı ilişkilendirilebilir.

    Veriler, FHIR URL'si olmayan bir uygulama tarafından oluşturuluyorsa bu, uygulama tarafından tanımlanan benzersiz ve anlaşılır bir URI (ör. myapp://..) olmalıdır. Bu URI, verilerin kaynağını işaret eder.

    Örneğin, bir istemci uygulaması derin bağlantıyı destekliyorsa bu derin bağlantı, FHIR temel URI'si olarak kullanılabilir. URI'nin maksimum uzunluğu 2.000 karakterdir.

  • Paket adı (otomatik olarak doldurulur): Verileri yazan uygulama.

  • FHIR sürümü (zorunlu): FHIR sürümü. Desteklenen bir sürüm olmalıdır.

MedicalDataSource kaydı oluşturma

Uygulamanızın bağlı olduğu her sağlık kuruluşu veya tüzel kişi için bir kayıt oluşturun.

// Create a `MedicalDataSource`
// Note that `displayName` must be unique across `MedicalDataSource`s
// Each `MedicalDataSource` is assigned an `id` by the system on creation
val medicalDataSource: MedicalDataSource =
    healthConnectClient.createMedicalDataSource(
        CreateMedicalDataSourceRequest(
            fhirBaseUri = Uri.parse("https://fhir.com/oauth/api/FHIR/R4/"),
            displayName = "Test Data Source",
            fhirVersion = FhirVersion(4, 0, 1)
        )
    )

MedicalDataSource kaydını silme

Önceki örnekte, sistem tarafından oluşturulurken bir id döndürülür. MedicalDataSource kaydını silmeniz gerekirse aynı id'a referans verin:

// Delete the `MedicalDataSource` that has the specified `id`
healthConnectClient.deleteMedicalDataSourceWithData(medicalDataSource.id)

Tıbbi kaynaklar

Health Connect'teki MedicalResource, meta verilerle birlikte bir FHIR kaynağını (tıbbi kayıt içeren) temsil eder.

MedicalResource'ün özellikleri:

  • DataSourceId (zorunlu) - MedicalDataSource için açıklandığı şekilde veri kaynağı.
  • FHIR sürümü (zorunlu): FHIR sürümü. Desteklenen bir sürüm olmalıdır.
  • FHIR kaynağı (zorunlu) JSON biçiminde kodlanmış FHIR kaynağı örneği.
  • Medical Resource type (automatically populated): Kullanıcılara yönelik izinlerle eşleşen kaynağın kullanıcıya yönelik kategorisi.

FHIR kaynaklarını JSON biçiminde hazırlama

Sağlık kaynaklarını Health Connect'e yazmadan önce FHIR kaynak kayıtlarınızı JSON biçiminde hazırlayın. Her JSON'u tıbbi kaynak olarak eklemek için kendi değişkeninde saklayın.

FHIR JSON biçimiyle ilgili yardıma ihtiyacınız varsa HL7 kuruluşu tarafından sağlanan örnek verilere bakın.

MedicalResource kayıtlarını ekleme veya güncelleme

MedicalDataSource için yeni MedicalResource kayıtları eklemek veya mevcut MedicalResource kayıtlarını güncellemek üzere UpsertMedicalResourceRequest'ü kullanın:

// Insert `MedicalResource`s into the `MedicalDataSource`
val medicalResources: List<MedicalResource> =
    healthConnectClient.upsertMedicalResources(
        listOf(
            UpsertMedicalResourceRequest(
                medicalDataSource.id,
                medicalDataSource.fhirVersion,
                medicationJsonToInsert // a valid FHIR json string
            )
        )
    )

// Update `MedicalResource`s in the `MedicalDataSource`
val updatedMedicalResources: List<MedicalResource> =
    healthConnectClient.upsertMedicalResources(
        listOf(
            UpsertMedicalResourceRequest(
                medicalDataSource.id,
                medicalDataSource.fhirVersion,
                // a valid FHIR json string
                // if this resource has the same type and ID as in `medicationJsonToInsert`,
                // this `upsertMedicalResources()` call will update the previously inserted
                // `MedicalResource`
                updatedMedicationJsonToInsert
            )
        )
    )

Örnek FHIR kaynağı

Önceki örnekte medicationJsonToInsert değişkeni geçerli bir FHIR JSON dizesini temsil ediyordu.

FHIR kaynak türü olarak AllergyIntolerance'ın kullanıldığı, PHR'deki FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE tıbbi kaynak türüyle eşleşen JSON örneğini aşağıda bulabilirsiniz:

{
  "resourceType": "AllergyIntolerance",
  "id": "allergyintolerance-1",
  "criticality": "high",
  "code": {
    "coding": [
      {
        "system": "http://snomed.info/sct",
        "code": "91936005",
        "display": "Penicillin allergy"
      }
    ],
    "text": "Penicillin allergy"
  },
  "recordedDate": "2020-10-09T14:58:00+00:00",
   "asserter": {
    "reference": "Patient/patient-1"
  },
  "lastOccurrence": "2020-10-09",
  "patient": {
    "reference": "Patient/patient-1",
    "display": "B., Alex"
  }
  ...
}

MedicalResource kaydını silme

MedicalResource kayıtları kimliğe göre silinebilir:

// Delete `MedicalResource`s matching the specified `dataSourceId`, `type` and `fhirResourceId`
healthConnectClient.deleteMedicalResources(
    medicalResources.map { medicalResource: MedicalResource ->
        MedicalResourceId(
            dataSourceId = medicalDataSource.id,
            fhirResourceType = medicalResource.id.fhirResourceType,
            fhirResourceId = medicalResource.id.fhirResourceId
        )
    }
)

Ayrıca medicalResourceType tarafından da silinebilirler:

// Delete all `MedicalResource`s that are in any pair of provided `dataSourceIds` and
// `medicalResourceTypes`
healthConnectClient.deleteMedicalResources(
    DeleteMedicalResourcesRequest(
        dataSourceIds = setOf(medicalDataSource.id),
        medicalResourceTypes = setOf(MEDICAL_RESOURCE_TYPE_MEDICATIONS)
    )
)