Развивайте навыки работы с системой Health Connect.

Если вы хотите создать приложение для управления жизненно важными показателями пользователей, вы можете использовать Health Connect для решения таких задач, как:

  • Считывайте жизненно важные данные, такие как артериальное давление, частота сердечных сокращений и температура тела, из других приложений.
  • Записывайте жизненно важные данные, полученные с помощью вашего приложения или подключенных устройств.
  • Отслеживайте тенденции и предоставляйте аналитическую информацию о состоянии здоровья на основе данных о жизненно важных показателях.

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

Обзор: Создание комплексной системы отслеживания жизненно важных показателей

Для создания комплексной системы отслеживания жизненно важных показателей с помощью Health Connect выполните следующие основные шаги:

  • Запрос соответствующих разрешений для доступа к данным жизненно важных показателей.
  • Запись жизненно важных данных с использованием таких записей, как BloodPressureRecord , HeartRateRecord и других.
  • Считывание данных о жизненно важных показателях для отображения, анализа или синхронизации.
  • Использование пакетной обработки для эффективной записи и чтения данных.

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

Прежде чем начать

Перед внедрением функций, отслеживающих жизненно важные показатели:

Ключевые понятия

В системе Health Connect данные о жизненно важных показателях представлены различными типами записей, каждая из которых соответствует определенному физиологическому измерению. В отличие от тренировок, данные о жизненно важных показателях часто записываются в виде данных за определенный момент времени или за определенный интервал.

Типы данных жизненно важных показателей

Важные статистические данные представлены отдельными типами записей. К распространенным типам относятся:

  • BloodPressureRecord : Отображает единичное измерение артериального давления, включая систолическое и диастолическое давление, а также положение тела.
  • HeartRateRecord : Представляет собой серию измерений частоты сердечных сокращений.
  • RestingHeartRateRecord : Представляет собой единичное измерение частоты сердечных сокращений в состоянии покоя.
  • BodyTemperatureRecord : Представляет собой единичное показание температуры тела, включая место измерения.
  • BloodGlucoseRecord : Представляет собой единичное измерение уровня глюкозы в крови, включая связь с приемом пищи и источником образца.
  • OxygenSaturationRecord : Представляет собой разовое измерение насыщения крови кислородом.
  • RespiratoryRateRecord : Представляет собой единичное измерение частоты дыхания.

Полный список типов данных см. в разделе «Типы данных Health Connect» .

Вопросы развития

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

Разрешения

Ваше приложение должно запросить соответствующие разрешения Health Connect, прежде чем считывать или записывать данные о жизненно важных показателях. К распространенным разрешениям для жизненно важных показателей относятся артериальное давление, частота сердечных сокращений, температура тела, уровень глюкозы в крови, насыщение крови кислородом и частота дыхания. Сюда относятся следующие:

  • Артериальное давление: права на чтение и запись для BloodPressureRecord .
  • Пульс: Права доступа на чтение и запись для HeartRateRecord .
  • Частота сердечных сокращений в состоянии покоя: права на чтение и запись для RestingHeartRateRecord .
  • Температура тела: права на чтение и запись для BodyTemperatureRecord .
  • Уровень глюкозы в крови: права на чтение и запись для BloodGlucoseRecord .
  • Насыщение кислородом: права на чтение и запись для OxygenSaturationRecord .
  • Частота дыхания: права на чтение и запись для RespiratoryRateRecord .

Ниже приведён пример того, как запросить разрешение на измерение артериального давления, частоты сердечных сокращений и температуры тела:

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

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

// Create a set of permissions for required data types
val PERMISSIONS =
    setOf(
  HealthPermission.getReadPermission(BloodPressureRecord::class),
  HealthPermission.getWritePermission(BloodPressureRecord::class),
  HealthPermission.getReadPermission(HeartRateRecord::class),
  HealthPermission.getWritePermission(HeartRateRecord::class),
  HealthPermission.getReadPermission(BodyTemperatureRecord::class),
  HealthPermission.getWritePermission(BodyTemperatureRecord::class)
)

Используйте 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)
  }
}

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

Для запроса разрешений вызовите функцию checkPermissionsAndRun :

if (!granted.containsAll(PERMISSIONS)) {
    requestPermissions.launch(PERMISSIONS)
    // Check if required permissions are not granted, and return
  }
// Permissions already granted; proceed with inserting or reading data

Если вам необходимо запросить разрешения только для одного типа данных, например, артериального давления, включите в набор разрешений только этот тип данных:

Доступ к измерению артериального давления защищен следующими разрешениями:

  • android.permission.health.READ_BLOOD_PRESSURE
  • android.permission.health.WRITE_BLOOD_PRESSURE

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

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

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

Для измерения артериального давления необходимо запросить следующие разрешения:

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

Записать данные о жизненно важных показателях

В этом разделе описывается, как записывать данные о жизненно важных показателях в Health Connect. Данные о жизненно важных показателях обычно записываются в виде отдельных записей. Если вы записываете несколько записей одновременно, например, для синхронизации с датчика или бэкэнда, используйте пакетную обработку.

Пример записи BloodPressureRecord :

suspend fun writeBloodPressureRecord(healthConnectClient: HealthConnectClient) {
    val record = BloodPressureRecord(
        time = Instant.now(),
        zoneOffset = ZoneOffset.UTC,
        systolic = Pressure.millimetersOfMercury(120.0),
        diastolic = Pressure.millimetersOfMercury(80.0),
        bodyPosition = BloodPressureRecord.BODY_POSITION_SITTING_DOWN,
        measurementLocation = BloodPressureRecord.MEASUREMENT_LOCATION_LEFT_WRIST
    )
    healthConnectClient.insertRecords(listOf(record))
}

Пакетная запись

Если вашему приложению необходимо записывать несколько точек данных, например, синхронизировать данные с подключенного устройства или серверной службы, следует использовать пакетную запись для повышения эффективности и снижения энергопотребления. Health Connect может обрабатывать до 1000 записей за один запрос на запись.

Следующий код демонстрирует, как записывать несколько записей одновременно:

suspend fun writeBatchRecords(healthConnectClient: HealthConnectClient) {
    val bloodPressureRecord = BloodPressureRecord(
        time = Instant.now(),
        zoneOffset = ZoneOffset.UTC,
        systolic = Pressure.millimetersOfMercury(120.0),
        diastolic = Pressure.millimetersOfMercury(80.0),
        bodyPosition = BloodPressureRecord.BODY_POSITION_SITTING_DOWN,
        measurementLocation = BloodPressureRecord.MEASUREMENT_LOCATION_LEFT_WRIST
    )
    val heartRateRecord = HeartRateRecord(
        startTime = Instant.now().minusSeconds(60),
        startZoneOffset = ZoneOffset.UTC,
        endTime = Instant.now(),
        endZoneOffset = ZoneOffset.UTC,
        samples = listOf(HeartRateRecord.Sample(time = Instant.now().minusSeconds(30), beatsPerMinute = 80))
    )
    healthConnectClient.insertRecords(listOf(bloodPressureRecord, heartRateRecord))
}

Считывание данных жизненно важных показателей

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

Пример чтения данных из базы данных BloodPressureRecord :

suspend fun readBloodPressureRecords(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant
) {
    val response = healthConnectClient.readRecords(
        ReadRecordsRequest(
            recordType = BloodPressureRecord::class,
            timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
        )
    )

    for (record in response.records) {
        // Process each blood pressure record
        val systolic = record.systolic
        val diastolic = record.diastolic
    }
}

Если вам необходимо синхронизировать данные о жизненно важных показателях с серверной частью или поддерживать актуальность хранилища данных вашего приложения с помощью Health Connect, используйте ChangeLogs. Это позволяет получить список добавленных, обновленных или удаленных записей с определенного момента времени, что более эффективно, чем ручное отслеживание изменений или многократное чтение всех данных. Для получения дополнительной информации см. раздел «Синхронизация данных с Health Connect» .

Передовые методы

Следуйте этим рекомендациям, чтобы повысить достоверность данных и удобство использования:

  • Частота записи и пакетная обработка : Чтобы уменьшить накладные расходы на ввод/вывод и продлить срок службы батареи, группируйте точки данных в один вызов insertRecords с пакетами до 1000 записей, вместо того чтобы записывать каждую точку по отдельности.
    • Отслеживание в реальном времени: Для частых обновлений данных с датчиков (например, от устройств непрерывного мониторинга уровня глюкозы или пульса) записывайте данные партиями с интервалом до 15 минут, чтобы сбалансировать обновления в реальном времени с эффективностью использования батареи.
    • Фоновая синхронизация: используйте WorkManager для отложенной записи, например, для синхронизации данных с сопутствующего устройства или серверной службы. Для пакетной записи устанавливайте интервал в 15 минут.
  • Избегайте записи дублирующихся данных: используйте идентификаторы клиентов. При создании записей задайте параметр metadata.clientRecordId . Health Connect использует его для идентификации уникальных записей. Если вы попытаетесь записать запись с уже существующим clientRecordId , Health Connect проигнорирует дубликат или обновит существующую запись, а не создаст новую. Установка параметра metadata.clientRecordId — наиболее эффективный способ предотвратить дубликаты при повторных попытках синхронизации или переустановке приложения.

    val record = BloodPressureRecord(
        time = Instant.now(),
        zoneOffset = ZoneOffset.UTC,
        systolic = Pressure.millimetersOfMercury(120.0),
        diastolic = Pressure.millimetersOfMercury(80.0),
        bodyPosition = BloodPressureRecord.BODY_POSITION_SITTING_DOWN,
        measurementLocation = BloodPressureRecord.MEASUREMENT_LOCATION_LEFT_WRIST,
        metadata = Metadata(
            // Use a unique ID from your own database
            clientRecordId = "bp_20240101_user123"
        )
    )
  • Проверьте существующие данные: перед синхронизацией данных запросите у Health Connect записи за период синхронизации, чтобы убедиться, что данные из вашего приложения уже существуют, во избежание дубликатов или перезаписи более новых данных.

  • Четко обоснуйте необходимость предоставления разрешения: используйте поток Permission.createIntent , чтобы объяснить, почему вашему приложению необходим доступ к данным о здоровье, например: «Для отслеживания динамики артериального давления и предоставления аналитической информации».

  • Согласуйте временные метки с измерениями: убедитесь, что временные метки записей точно отражают время проведения измерений. Для интервальных данных, таких как HeartRateRecord , убедитесь, что startTime и endTime указаны правильно.

Тестирование

Для проверки корректности данных и обеспечения высокого качества пользовательского опыта следуйте этим стратегиям тестирования и обратитесь к официальной документации по основным вариантам использования тестирования .

инструменты проверки

  • Health Connect Toolbox : Используйте это сопутствующее приложение для ручной проверки записей, удаления тестовых данных и имитации изменений в базе данных. Это лучший способ убедиться в правильности хранения ваших записей.
  • Модульное тестирование с помощью FakeHealthConnectClient : используйте библиотеку тестирования, чтобы проверить, как ваше приложение обрабатывает граничные случаи, такие как отзыв разрешений или исключения API, без необходимости использования физического устройства.

Контрольный список качества

Типичная архитектура

Обычно система мониторинга жизненно важных показателей включает в себя:

Компонент Управляет
Контроллер жизненно важных функций Показания датчика/входного сигнала
Логика пакетной обработки
Уровень репозитория (обертывает операции Health Connect): Вставьте записи о жизненно важных показателях.
Прочитайте записи о жизненно важных показателях.
Уровень пользовательского интерфейса (дисплеи): Чтение вживую
Исторические данные
Графики и тренды

Поиск неисправностей

Симптом Возможная причина Разрешение
Отсутствующие типы данных (например, артериальное давление) Отсутствуют права на запись или некорректно работают временные фильтры. Убедитесь, что вы запросили разрешение на доступ к данным определенного типа и пользователь его предоставил. Проверьте, что ваш ReadRecordsRequest использует TimeRangeFilter , охватывающий время измерения. См. раздел «Разрешения» .
Появляются повторяющиеся записи. Отсутствует clientRecordId . Присвойте каждой записи уникальный clientRecordId в Metadata . Это позволит Health Connect выполнить дедупликацию, если одни и те же данные будут записаны дважды во время повторной попытки синхронизации. См. раздел «Рекомендации» .
Записи не записываются. Неверные единицы измерения или значения, выходящие за пределы допустимого диапазона. Система Health Connect проверяет значения записей. Например, значения артериального давления должны находиться в физиологически правдоподобном диапазоне. Для получения информации о допустимых диапазонах и единицах измерения ознакомьтесь с документацией по типам данных.

Типичные шаги отладки

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