Это руководство совместимо с Health Connect версии 1.1.0-beta02 .
Чтобы прочитать медицинские данные с помощью личных медицинских записей (PHR) в Health Connect, выполните следующие действия:
- Проверьте доступность функции.
- Запросить разрешения на чтение.
- Прочтите медицинские записи (
MedicalResource
). - Чтение источников данных (
MedicalDataSource
).
Доступность функций
Чтобы определить, поддерживает ли устройство пользователя 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.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
для запроса этих разрешений. Откроется экран разрешений 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)
}
}
Поскольку пользователи могут предоставлять или отзывать разрешения в любое время, вашему приложению необходимо периодически проверять наличие предоставленных разрешений и обрабатывать сценарии, в которых разрешения теряются.
Медицинские ресурсы
Вы можете прочитать любой медицинский ресурс ( MedicalResource
), написанный для пользователя в Health Connect, включая те, которые добавлены другими приложениями.
Получить записи MedicalResource
Отфильтруйте запрос на получение, указав 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.
// All `MedicalResource`s in the given `MedicalDataSource`s and of given `medicalResourceType`
// will be retrieved.
val initialRequest: ReadMedicalResourcesRequest =
ReadMedicalResourcesInitialRequest(
MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS,
setOf(medicalDataSource.id),
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
), записанный в Health Connect для пользователя, включая те, которые добавлены другими приложениями.
Получить запись 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))