Это руководство совместимо с Health Connect версии 1.1.0-beta02 .
Чтобы записать медицинские данные с помощью Medical Records в Health Connect, выполните следующие действия:
- Проверить наличие функции
- Запросить разрешение на запись
- Создать источник данных (
MedicalDataSource
) - Напишите медицинский ресурс (
MedicalResource
)
Наличие функции
Чтобы определить, поддерживает ли устройство пользователя медицинские записи в 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://..
), который указывает на источник данных.Например, если клиентское приложение поддерживает deep linking , то этот deeplink можно использовать как FHIR Base URI. Максимальная длина 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
в медицинских записях:
{
"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)
)
)