Чтение медицинских данных

Это руководство совместимо с платформой "Здоровье и спорт" версии 1.1.0-beta02 или более поздней.

Чтобы прочитать медицинские данные с помощью функции "Медицинские карты" на платформе "Здоровье и спорт", выполните следующие действия:

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

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

Чтобы определить, поддерживает ли устройство пользователя медицинские карты в сервисе "Здоровье и спорт", проверьте доступность 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.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES
  • android.permission.health.READ_MEDICAL_DATA_CONDITIONS
  • android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS
  • android.permission.health.READ_MEDICAL_DATA_MEDICATIONS
  • android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS
  • android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS
  • android.permission.health.READ_MEDICAL_DATA_PREGNANCY
  • android.permission.health.READ_MEDICAL_DATA_PROCEDURES
  • android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY
  • android.permission.health.READ_MEDICAL_DATA_VACCINES
  • android.permission.health.READ_MEDICAL_DATA_VISITS
  • android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS

Укажите эти разрешения в Play Console и манифесте приложения:

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

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

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

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

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

// Create a set of permissions for required data types
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_CONDITIONS
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_LABORATORY_RESULTS
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_MEDICATIONS
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_PERSONAL_DETAILS
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_PRACTITIONER_DETAILS
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_PREGNANCY
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_PROCEDURES
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_SOCIAL_HISTORY
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_VACCINES
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_VISITS
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_VITAL_SIGNS

val PERMISSIONS =
    setOf(
        PERMISSION_READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES
        PERMISSION_READ_MEDICAL_DATA_CONDITIONS
        PERMISSION_READ_MEDICAL_DATA_LABORATORY_RESULTS
        PERMISSION_READ_MEDICAL_DATA_MEDICATIONS
        PERMISSION_READ_MEDICAL_DATA_PERSONAL_DETAILS
        PERMISSION_READ_MEDICAL_DATA_PRACTITIONER_DETAILS
        PERMISSION_READ_MEDICAL_DATA_PREGNANCY
        PERMISSION_READ_MEDICAL_DATA_PROCEDURES
        PERMISSION_READ_MEDICAL_DATA_SOCIAL_HISTORY
        PERMISSION_READ_MEDICAL_DATA_VACCINES
        PERMISSION_READ_MEDICAL_DATA_VISITS
        PERMISSION_READ_MEDICAL_DATA_VITAL_SIGNS
)

Используйте getGrantedPermissions, чтобы проверить, есть ли у приложения необходимые разрешения. Если нет, запросите их с помощью createRequestPermissionResultContract. Откроется экран разрешений платформы "Здоровье и спорт".

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

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

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

Вы можете читать любые медицинские ресурсы (MedicalResource), записанные на платформе "Здоровье и спорт" для пользователя, в том числе добавленные другими приложениями.

Как получить записи MedicalResource

Отфильтруйте GET-запрос, указав medicalResourceType. Используйте постраничные запросы и учитывайте ограничение частоты запросов.

// Read `MedicalResource`s back from the `MedicalDataSource`
// Read 100 resources / page. See `pageSize` doc for defaults and limits.
val pageSize = 100
// Prepare the initial read request.
// If `medicalDataSourceIds` is empty, all `MedicalResource`s of the given `medicalResourceType`
// across all `MedicalDataSource`s will be retrieved.
val initialRequest: ReadMedicalResourcesRequest =
    ReadMedicalResourcesInitialRequest(
        MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS,
        medicalDataSourceIds = emptySet(),
        pageSize = pageSize,
    )
// Continue reading pages until all `MedicalResource`s are read
var pageToken: String? = null
do {
    // Prepare paged request if needed
    val request: ReadMedicalResourcesRequest =
        if (pageToken == null) initialRequest
        else ReadMedicalResourcesPageRequest(pageToken, pageSize = pageSize)
    // Read `MedicalResource`s
    val response: ReadMedicalResourcesResponse =
        healthConnectClient.readMedicalResources(request)
    // Process `MedicalResource`s
    val resources: List<MedicalResource> = response.medicalResources
    // Advance to next page
    pageToken = response.nextPageToken
} while (pageToken != null)

Как получить записи MedicalResource по идентификатору

Вы также можете получить MedicalResource, используя идентификатор:

// Retrieve `fhirResourceType` type `MedicalResource`s with the specified `id`s from the
// provided `MedicalDataSource`
val retrievedMedicalResources: List<MedicalResource> =
    healthConnectClient.readMedicalResources(
        medicalResources.map { medicalResource: MedicalResource ->
            MedicalResourceId(
                dataSourceId = medicalDataSource.id,
                fhirResourceType = medicalResource.id.fhirResourceType,
                fhirResourceId = medicalResource.id.fhirResourceId
            )
        }
    )

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

Вы можете читать любые источники данных (MedicalDataSource), записанные на платформе "Здоровье и спорт" для пользователя, в том числе добавленные другими приложениями.

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

Получение записи MedicalDataSource по названию пакета

Используйте GetMedicalDataSourcesRequest, чтобы запросить по названию пакета (приложение):

// Retrieve all `MedicalDataSource`s created by any of the specified package names
// Package names may be found in other `MedicalDataSource`s or from arbitrary input
val medicalDataSources: List<MedicalDataSource> =
    healthConnectClient.getMedicalDataSources(
        GetMedicalDataSourcesRequest(listOf(medicalDataSource.packageName, anotherPackageName))
    )

Получить запись MedicalDataSource по идентификатору

Или запросите по id, если вы его знаете:

// Retrieve all `MedicalDataSource` with `id` matching any of the given ids
val medicalDataSources: List<MedicalDataSource> =
    healthConnectClient.getMedicalDataSources(listOf(medicalDataSource.id, anotherId))