Zapisywanie danych medycznych

Ten przewodnik jest zgodny z Health Connect w wersji 1.1.0-beta02.

Aby zapisywać dane medyczne za pomocą danych o stanie zdrowia w Health Connect, wykonaj te czynności:

  1. Sprawdzanie dostępności funkcji
  2. Poproś o uprawnienia do zapisu
  3. Tworzenie źródła danych (MedicalDataSource)
  4. Napisać materiał medyczny (MedicalResource)

Dostępność funkcji

Aby sprawdzić, czy urządzenie użytkownika obsługuje PHR w Health Connect, sprawdź dostępność FEATURE_PERSONAL_HEALTH_RECORD na kliencie:

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

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

Więcej informacji znajdziesz w sekcji Sprawdzanie dostępności funkcji.

Wymagane uprawnienia

Zapisywanie danych medycznych jest chronione przez to uprawnienie:

  • android.permission.health.WRITE_MEDICAL_DATA

Zadeklaruj te uprawnienia w Konsoli Play dla swojej aplikacji, a także w pliku manifestu aplikacji:

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

Użytkownik jest odpowiedzialny za zadeklarowanie wszystkich odpowiednich uprawnień, których zamierza używać na urządzeniach i w aplikacjach. Przed użyciem musisz też sprawdzić, czy użytkownik przyznał Ci odpowiednie uprawnienia.

Prośba o uprawnienia od użytkownika

Po utworzeniu instancji klienta aplikacja musi poprosić użytkownika o przyznanie uprawnień. Użytkownicy muszą mieć możliwość przyznania lub odmowy przyznania uprawnień w dowolnym momencie.

Aby to zrobić, utwórz zestaw uprawnień dla wymaganych typów danych. Najpierw sprawdź, czy uprawnienia w zestawie są zadeklarowane w pliku manifestu Androida.

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

Użyj getGrantedPermissions, aby sprawdzić, czy Twoja aplikacja ma już przyznane wymagane uprawnienia. Jeśli nie, użyj createRequestPermissionResultContract, aby poprosić o te uprawnienia. Wyświetli się ekran uprawnień Health Connect.

// 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)
  }
}

Użytkownicy mogą w dowolnym momencie przyznać lub wycofać uprawnienia, dlatego aplikacja musi okresowo sprawdzać, czy zostały one przyznane, oraz obsługiwać scenariusze, w których użytkownik wycofuje uprawnienia.

Źródła danych

Element MedicalDataSource w Health Connect reprezentuje dane pochodzące od użytkownika, np. od organizacji opieki zdrowotnej, szpitala lub interfejsu API.

Dokumentacja medyczna przechowywana w Health Connect jest uporządkowana w MedicalDataSource. Umożliwia to rozdzielenie danych medycznych dotyczących tej samej osoby, które pochodzą z różnych źródeł, takich jak interfejsy API czy systemy opieki zdrowotnej.

Jeśli wszystkie rekordy pochodzą z tego samego źródła, aplikacja do pisania musi utworzyć tylko jeden MedicalDataSource. Jeśli rekordy pochodzą z kilku źródeł, aplikacja może nadal tworzyć pojedynczy MedicalDataSource, jeśli dane zostaną uzgodnione, a wszystkie rekordy mają unikalną kombinację typu zasobu FHIR i identyfikatora zasobu FHIR. W przeciwnym razie dla każdego źródła danych należy utworzyć MedicalDataSource.

Wszystkie dane medyczne muszą być powiązane z poziomem MedicalDataSource, dlatego musisz go utworzyć przed zapisaniem zasobów.

Właściwości MedicalDataSource:

  • Wyświetlana nazwa (wymagany) – wyświetlana nazwa źródła danych, która jest jednoznacznie identyfikowana w poszczególnych aplikacjach do pisania.
  • URI podstawowe FHIR (wymagane) – w przypadku danych pochodzących z serwera FHIR powinien to być adres URL podstawowe FHIR (np. https://example.com/fhir/). Z tym samym adresem URL bazowym FHIR można powiązać wiele źródeł danych.

    Jeśli dane są generowane przez aplikację bez adresu URL FHIR, powinien to być unikalny i zrozumiały identyfikator URI zdefiniowany przez aplikację (na przykład myapp://..), który wskazuje na źródło danych.

    Jeśli na przykład aplikacja klienta obsługuje precyzyjne linki, można użyć takiego linku jako podstawowego identyfikatora URI FHIR. Maksymalna długość adresu URI to 2000 znaków.

  • Nazwa pakietu (wypełniana automatycznie) – aplikacja zapisująca dane.

  • Wersja FHIR (wymagane) – wersja FHIR. Musi to być obsługiwana wersja.

Tworzenie rekordu MedicalDataSource

Utwórz rekord dla każdej organizacji lub instytucji opieki zdrowotnej, z którą jest powiązana Twoja aplikacja.

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

Usuwanie rekordu MedicalDataSource

Poprzedni przykład zwraca id utworzone przez system. Jeśli chcesz usunąć rekord MedicalDataSource, odwołuj się do tego samego rekordu id:

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

Zasoby medyczne

Element MedicalResource w Health Connect reprezentuje zasób FHIR (zawierający dane medyczne) wraz z metadanymi.

Właściwości MedicalResource:

  • DataSourceId (wymagany) – źródło danych opisane w sekcji MedicalDataSource.
  • Wersja FHIR (wymagane) – wersja FHIR. Musi to być obsługiwana wersja.
  • Zasób FHIR (wymagany) – instancja zasobu FHIR zakodowana w formacie JSON.
  • Typ zasobu medycznego (wypełniany automatycznie) – kategoria zasobu, która jest mapowana na uprawnienia użytkownika.

Przygotowywanie zasobów FHIR w formacie JSON

Zanim zapiszesz zasoby medyczne w Health Connect, przygotuj rekordy zasobów FHIR w formacie JSON. Przechowuj każdy plik JSON w osobnej zmiennej, aby wstawiać go jako zasób medyczny.

Jeśli potrzebujesz pomocy w przypadku formatu JSON FHIR, zapoznaj się z przykładowymi danymi udostępnionymi przez organizację HL7.

Wstawianie i aktualizowanie rekordów MedicalResource

Aby wstawić nowe rekordy UpsertMedicalResourceRequest lub zaktualizować istniejące rekordy MedicalResource w MedicalDataSource, użyj elementu UpsertMedicalResourceRequest:

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

Przykład zasobu FHIR

W poprzednim przykładzie zmienna medicationJsonToInsert reprezentowała prawidłowy ciąg JSON FHIR.

Oto przykład tego, jak może wyglądać plik JSON, który używa typu zasobu FHIR AllergyIntolerance jako typu zasobu medycznego FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE w PHR:

{
  "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"
  }
  ...
}

Usuwanie rekordu MedicalResource

Rekordy MedicalResource mogą zostać usunięte według identyfikatora:

// 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
        )
    }
)

Mogą też zostać usunięte przez medicalResourceType:

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