Это руководство совместимо с платформой "Здоровье и спорт" версии 1.2.0-alpha05 или более поздней.
В метаданных платформы "Здоровье и спорт" произошли изменения, которые затронут разработчиков, обновивших приложение до версии 1.1.0-alpha12 или более поздней.
Информация о библиотеке
Идентификатор артефакта плагина Google Maven Android Gradle определяет библиотеку приложения "Здоровье и спорт", до которой вам нужно обновиться.
Добавьте зависимость Health Connect SDK в файл build.gradle на уровне модуля:
dependencies {
implementation "androidx.health.connect:connect-client:1.1.0-alpha12"
}
Изменения метаданных
В Jetpack SDK платформы "Здоровье и спорт" версии 1.1.0-alpha12 были добавлены два изменения метаданных, которые помогают проверять наличие дополнительных полезных метаданных в экосистеме. Если в конструкторе Record не указан параметр metadata, может возникнуть ошибка Constructor internal.
Укажите способ записи
При создании экземпляра объекта типа Record() необходимо указать метаданные.
При записи данных в Здоровье и спорт необходимо указать один из четырех методов записи, используя один из соответствующих фабричных методов для создания экземпляра Metadata:
| Способ записи | Описание |
|---|---|
RECORDING_METHOD_UNKNOWN |
Не удалось проверить способ записи. |
RECORDING_METHOD_MANUAL_ENTRY |
Пользователь ввел данные. |
RECORDING_METHOD_AUTOMATICALLY_RECORDED |
Данные записаны устройством или датчиком. |
RECORDING_METHOD_ACTIVELY_RECORDED |
Пользователь начал или завершил запись на устройстве. |
Пример:
StepsRecord( startTime = Instant.ofEpochMilli(1234L), startZoneOffset = null, endTime = Instant.ofEpochMilli(1236L), endZoneOffset = null, metadata = Metadata.activelyRecorded(device = Device(type = Device.TYPE_WATCH)), count = 10 )
Тип устройства
Для всех автоматически и активно записываемых данных необходимо указать тип устройства. Подробную информацию можно найти в документации по классу Device в Jetpack. В настоящее время поддерживаются следующие типы устройств:
| Тип устройства | Описание |
|---|---|
TYPE_UNKNOWN |
Тип устройства неизвестен. |
TYPE_WATCH |
Тип устройства – часы. |
TYPE_PHONE |
Тип устройства – телефон. |
TYPE_SCALE |
Тип устройства – весы. |
TYPE_RING |
Тип устройства – кольцо. |
TYPE_HEAD_MOUNTED |
Тип устройства – наголовный дисплей. |
TYPE_FITNESS_BAND |
Тип устройства – фитнес-браслет. |
TYPE_CHEST_STRAP |
Тип устройства – нагрудный ремень. |
TYPE_SMART_DISPLAY |
Тип устройства – умный дисплей. |
Некоторые значения Device.type доступны только в более поздних версиях платформы "Здоровье и спорт". Если функция расширенных типов устройств недоступна, эти типы обрабатываются как Device.TYPE_UNKNOWN.
| Расширенные типы устройств | Описание |
|---|---|
TYPE_CONSUMER_MEDICAL_DEVICE |
Тип устройства – медицинское изделие. |
TYPE_GLASSES |
Тип устройства – умные очки. |
TYPE_HEARABLE |
Тип устройства – наушники. |
TYPE_FITNESS_MACHINE |
Тип устройства – стационарный тренажер. |
TYPE_FITNESS_EQUIPMENT |
Тип устройства – тренажер. |
TYPE_PORTABLE_COMPUTER |
Тип устройства – портативный компьютер. |
TYPE_METER |
Тип устройства – измерительный прибор. |
FEATURE_EXTENDED_DEVICE_TYPES на клиенте:
if (healthConnectClient
.features
.getFeatureStatus(
HealthConnectFeatures.FEATURE_EXTENDED_DEVICE_TYPES
) == HealthConnectFeatures.FEATURE_STATUS_AVAILABLE) {
// Feature is available
} else {
// Feature isn't available
}
Пример:
val WATCH_DEVICE = Device( manufacturer = "Google", model = "Pixel Watch", type = Device.TYPE_WATCH ) // Phone val PHONE_DEVICE = Device( manufacturer = "Google", model = "Pixel 8", type = Device.TYPE_PHONE ) // Ring val RING_DEVICE = Device( manufacturer = "Oura", model = "Ring Gen3", type = Device.TYPE_RING ) // Scale val SCALE_DEVICE = Device( manufacturer = "Withings", model = "Body Comp", type = Device.TYPE_SCALE )
Уникальный идентификатор устройства (UDI)
В приложении "Здоровье и спорт" в Android 17 (уровень API 37.1) или U extension 23 и более поздних версиях класс Device поддерживает уникальный идентификатор устройства (UDI). Связывание зарегистрированных сведений о модели UDI медицинского изделия с вашими записями позволяет последующим приложениям (например, платформам телемедицины или клиническим порталам) идентифицировать показания клинического уровня и отличать их от общих данных потребительских носимых устройств.
Объявите разрешение
Чтобы записывать сведения об UDI в сервис "Здоровье и спорт", необходимо объявить разрешение WRITE_DEVICE_UDI в файле AndroidManifest.xml приложения:
<uses-permission android:name="android.permission.health.WRITE_DEVICE_UDI" />
Обратите внимание, что WRITE_DEVICE_UDI – это обычное разрешение. Его нужно объявить в манифесте, но запрашивать у пользователя во время выполнения не требуется. Оно автоматически предоставляется приложению при установке.
Укажите только идентификатор устройства (DI)
Полный UDI состоит из двух частей:
- Идентификатор устройства (UDI-DI). Общепринятый идентификатор, который присваивается определенной модели устройства уполномоченным агентством, например GS1.
- Идентификатор производства (UDI-PI) – атрибуты, относящиеся к конкретному устройству, например серийный номер, номер партии, дата производства или срок годности.
Чтобы защитить конфиденциальность пользователя, указывайте в Здоровье и спорте только идентификатор устройства. Не включайте атрибуты идентификаторов товара (например, серийные номера или номера партий).
Пример кода
Примечание. Вы можете задать UDI при создании экземпляра Device.
Jetpack SDK
val device = Device( type = Device.TYPE_CONSUMER_MEDICAL_DEVICE, manufacturer = "Omron", model = "HEM-7121", udi = "04015674011832" // Device Identifier (UDI-DI) portion only )
Platform API
val device = Device.Builder() .setType(Device.DEVICE_TYPE_CONSUMER_MEDICAL_DEVICE) .setManufacturer("Omron") .setModel("HEM-7121") .setUdi("04015674011832") // Device Identifier (UDI-DI) portion only .build()
Если вы попытаетесь записать данные с UDI, не объявив разрешение WRITE_DEVICE_UDI, Здоровье и спорт выдаст ошибку SecurityException.
Используйте UDI, чтобы проверить разрешение на использование устройства
Платформа "Здоровье и спорт" служит транспортным уровнем и не проверяет подлинность или статус регистрации UDI.
Для средств чтения данных наличие UDI указывает на то, что данные поступают от зарегистрированного медицинского изделия. Приложения для считывания должны запрашивать информацию из баз данных регулирующих органов, таких как Глобальная база данных уникальных идентификаторов устройств (GUDID) Управления по санитарному надзору за качеством пищевых продуктов и медикаментов США (FDA) или Европейская база данных по медицинским изделиям (EUDAMED), чтобы проверять классификацию устройств, статус разрешения регулирующих органов (например, класс I, II или III) или конкретное назначение.
Фрагменты обновлены.
Руководства по платформе "Здоровье и спорт" были обновлены, чтобы соответствовать новым требованиям к метаданным. Примеры приведены на странице Запись данных.
Новые методы метаданных
Метаданные больше нельзя создавать напрямую, поэтому используйте один из фабричных методов, чтобы получить новый экземпляр метаданных. Фабричные методы проверяют, предоставлена ли информация об устройстве, когда для записи данных использовалось устройство или датчик. Для данных, введенных вручную, предоставление информации об устройстве остается необязательным. У каждой функции есть три варианта сигнатуры:
activelyRecordedfun activelyRecorded(device: Device): Metadata.fun activelyRecorded(clientRecordId: String, clientRecordVersion: Long = 0, device: Device): Metadatafun activelyRecordedWithId(id: String, device: Device): Metadata
autoRecordedfun autoRecorded(device: Device): Metadatafun autoRecorded(clientRecordId: String, clientRecordVersion: Long = 0, device: Device): Metadatafun autoRecordedWithId(id: String, device: Device): Metadata
manualEntryfun manualEntry(device: Device? = null): Metadatafun manualEntry(clientRecordId: String, clientRecordVersion: Long = 0, device: Device? = null): Metadatafun manualEntryWithId(id: String, device: Device? = null): Metadata
unknownRecordingMethodfun unknownRecordingMethod(device: Device? = null): Metadatafun unknownRecordingMethod(clientRecordId: String, clientRecordVersion: Long = 0, device: Device? = null): Metadatafun unknownRecordingMethodWithId(id: String, device: Device? = null): Metadata
Дополнительную информацию можно найти на сайте Android Open Source Project.
Тестовые данные
Используйте Testing Library и MetadataTestHelper, чтобы имитировать ожидаемые значения метаданных:
private val TEST_METADATA =
Metadata.unknownRecordingMethod(
clientRecordId = "clientId",
clientRecordVersion = 1L,
device = Device(type = Device.TYPE_UNKNOWN),
).populatedWithTestValues(id = "test")
Это имитирует поведение реализации Здоровье и спорт, которая автоматически заполняет эти значения во время вставки записи.
Чтобы использовать библиотеку тестирования, добавьте в файл build.gradle на уровне модуля следующую зависимость SDK Здоровья и спорта:
dependencies {
testImplementation "androidx.health.connect:connect-testing:1.0.0-alpha02"
}
Обновление библиотеки
Основные этапы:
Обновите библиотеку до версии 1.1.0-alpha12.
При сборке библиотеки будут возникать ошибки компиляции, указывающие на необходимость добавления новых метаданных. Чтобы устранить эти ошибки и завершить перенос, внесите следующие изменения:
- При создании объекта
Recordнеобходимо указать метод записи. Для этого используется один из фабричных методов, доступных вMetadata, напримерMetadata.manualEntry()илиMetadata.activelyRecorded(device = Device(...)). - Для данных, записанных устройством, необходимо указать тип устройства, например
Device.TYPE_WATCHилиDevice.TYPE_PHONE.
- При создании объекта
Если ваше приложение записывает данные о дополнительных типах устройств, ограничьте их с помощью
FEATURE_EXTENTED_DEVICE_TYPES, чтобы избежать непредвиденных ошибокTYPE_UNKNOWNна устройствах, где эта функция недоступна.