Напишите медицинские данные

Это руководство совместимо с Health Connect версии 1.1.0-beta02 .

Чтобы записать медицинские данные с помощью личных медицинских записей (PHR) в Health Connect, выполните следующие действия:

  1. Проверьте доступность функции
  2. Запросить разрешения на запись
  3. Создайте источник данных ( MedicalDataSource )
  4. Написать медицинский ресурс ( MedicalResource )

Доступность функций

Чтобы определить, поддерживает ли устройство пользователя PHR в Health Connect, проверьте доступность FEATURE_PERSONAL_HEALTH_RECORD на клиенте:

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

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

Дополнительную информацию см. в разделе Проверка доступности функций .

Требуемые разрешения

Написание медицинских данных защищено следующим разрешением:

  • android.permission.health.WRITE_MEDICAL_DATA

Объявите эти разрешения в Play Console для вашего приложения, а также в манифесте вашего приложения:

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

Вы несете ответственность за объявление всех соответствующих разрешений, которые вы собираетесь использовать на своих устройствах и приложениях. Перед использованием вам также следует убедиться, что каждое разрешение было предоставлено пользователем.

Запросить разрешения у пользователя

После создания экземпляра клиента вашему приложению необходимо запросить разрешения у пользователя. Пользователям должно быть разрешено предоставлять или отказывать в разрешениях в любое время.

Для этого создайте набор разрешений для необходимых типов данных. Убедитесь, что разрешения в наборе сначала объявлены в манифесте Android.

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

Используйте getGrantedPermissions , чтобы узнать, есть ли у вашего приложения необходимые разрешения. Если нет, используйте createRequestPermissionResultContract для запроса этих разрешений. Откроется экран разрешений 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)
  }
}

Поскольку пользователи могут предоставлять или отзывать разрешения в любое время, вашему приложению необходимо периодически проверять наличие предоставленных разрешений и обрабатывать сценарии, в которых разрешения теряются.

Источники данных

MedicalDataSource в Health Connect представляет собой источник данных, ориентированный на пользователя, например организацию здравоохранения, больницу или API.

Медицинские записи, хранящиеся в Health Connect, организованы в MedicalDataSource . Это позволяет разделить медицинские записи одного и того же человека, поступающие из разных источников, таких как API или системы здравоохранения.

Если все записи происходят из одного и того же источника, приложению для записи достаточно создать только один MedicalDataSource . Если записи происходят из нескольких источников, приложение все равно может создать один MedicalDataSource , если эти данные согласованы и все записи имеют уникальную комбинацию типа ресурса FHIR и идентификатора ресурса FHIR. В противном случае для каждого источника данных необходимо создать MedicalDataSource .

Все медицинские записи должны быть связаны с MedicalDataSource , поэтому его необходимо создать перед записью ресурсов.

Свойства MedicalDataSource :

  • Отображаемое имя (обязательно) — отображаемое имя источника данных, обращенное к пользователю, уникально идентифицируемое для каждого приложения записи.
  • Базовый URI FHIR (обязательно). Для данных, поступающих с сервера FHIR, это должен быть базовый URL-адрес FHIR (например, https://example.com/fhir/ ). Несколько источников данных могут быть связаны с одним и тем же базовым URL-адресом FHIR.

    Если данные генерируются приложением без URL-адреса FHIR, это должен быть уникальный и понятный URI, определенный приложением (например, myapp://.. ), указывающий на источник данных.

    Например, если клиентское приложение поддерживает глубокие ссылки , эту глубокую ссылку можно использовать в качестве базового URI FHIR. Максимальная длина URI — 2000 символов.

  • Имя пакета (заполняется автоматически) — приложение, записывающее данные.

  • Версия FHIR (обязательно) — версия FHIR. Должна быть поддерживаемая версия .

Создайте запись MedicalDataSource.

Создайте запись для каждой медицинской организации или организации, с которой связано ваше приложение.

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

Предыдущий пример возвращает id системы при создании. Если вам нужно удалить запись MedicalDataSource , укажите тот же id :

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

Медицинские ресурсы

MedicalResource в Health Connect представляет собой ресурс FHIR (который содержит медицинскую карту) вместе с метаданными.

Свойства MedicalResource :

  • DataSourceId (обязательно) — источник данных, как описано для MedicalDataSource .
  • Версия FHIR (обязательно) — версия FHIR. Должна быть поддерживаемая версия .
  • Ресурс FHIR (обязательно) Экземпляр ресурса FHIR в формате JSON.
  • Тип медицинского ресурса (заполняется автоматически) — категория ресурса, доступная пользователю , сопоставленная с разрешениями пользователя.

Подготовьте ресурсы FHIR в формате JSON.

Прежде чем записывать медицинские ресурсы в Health Connect, подготовьте записи ресурсов FHIR в формате JSON. Сохраните каждый JSON в отдельной переменной для вставки в качестве медицинского ресурса.

Если вам нужна помощь с форматом FHIR JSON, обратитесь к примеру данных, предоставленному организацией HL7 .

Вставка или обновление записей MedicalResource

Используйте UpsertMedicalResourceRequest для вставки новых или обновления существующих записей MedicalResource для MedicalDataSource :

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

Пример ресурса FHIR

В предыдущем примере переменная medicationJsonToInsert представляла действительную строку FHIR JSON.

Вот пример того, как может выглядеть этот JSON с использованием AllergyIntolerance в качестве типа ресурса FHIR, который будет сопоставляться с типом медицинского ресурса FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE в 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"
  }
  ...
}

Удаление записи MedicalResource

Записи MedicalResource могут быть удалены по идентификатору:

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

Или их можно удалить с помощью 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)
    )
)