Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Health Connect и FHIR
Читайте данные Android Health Connect от Fitbit, Garmin, Oura, Withings и Wear OS на Flutter и записывайте их в FHIR R4: разрешения, история, проверка Google Play.
Health Connect — это локальное хранилище данных о здоровье на Android: приложения Samsung Health, Fitbit, Garmin Connect, Oura, Withings и Wear OS записывают в него данные, а ваше приложение читает их с разрешения пользователя. Чтобы поместить эти данные в запись FHIR, прочитайте ежедневные итоги и средние значения на телефоне, отправьте их на ваш бэкенд и запишите каждую метрику как Observation с кодом LOINC и единицей измерения UCUM. На этой странице рассматриваются разрешения, требуемые Android, пример на Flutter (проверенный с flutter analyze), который читает Health Connect на Android и Apple Health на iOS с помощью одного и того же кода, а также правила публикации в Google Play.
Что попадает в Health Connect
Health Connect встроен в Android 14 и более поздние версии, а также доступен в виде приложения для более старых версий. Он хранит записи, такие как HeartRateRecord, RestingHeartRateRecord, HeartRateVariabilityRmssdRecord, OxygenSaturationRecord, RespiratoryRateRecord, StepsRecord, DistanceRecord, ActiveCaloriesBurnedRecord, SleepSessionRecord, WeightRecord, BloodPressureRecord, BloodGlucoseRecord, BodyTemperatureRecord и ExerciseSessionRecord.
Кто записывает данные, согласно документации каждого поставщика:
| Источник | Что ожидать |
|---|---|
| Fitbit и Pixel Watch | Приложение Fitbit синхронизируется с Health Connect после его настройки пользователем (Справка Google) |
| Garmin | Garmin Connect поддерживает Health Connect на Android 14 и более поздних версиях: данные об активности и самочувствии, такие как частота сердечных сокращений и калории (Android Developers, август 2025 г.) |
| Oura | Частота сердечных сокращений, ВСР, сон с фазами, шаги, расстояние, калории и тренировки (Oura) |
| Withings | Health Mate обменивается данными об активности, весе, сне и другими данными через Health Connect (Блог Android Developers) |
| Samsung Health, Galaxy Watch | Подмножество данных, в темпе Samsung Health — см. Samsung Health to FHIR |
Каждое приложение поставщика должно иметь разрешение на запись в Health Connect, которое пользователь предоставляет в этом приложении или в настройках Health Connect. Если источник отсутствует, это первое, что следует проверить.
Разрешения, требуемые Android
- Одно разрешение на тип записи и направление, например
android.permission.health.READ_HEART_RATEиandroid.permission.health.READ_STEPS, объявляется в манифесте и запрашивается во время выполнения. - История: без
android.permission.health.READ_HEALTH_DATA_HISTORYприложение может читать только последние 30 дней до предоставления разрешения. - Фоновый режим: для чтения, пока приложение не находится на переднем плане, требуется
android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND. - Экран обоснования разрешения (активность, обрабатывающая
ACTION_SHOW_PERMISSIONS_RATIONALE, плюс псевдоним активности в Android 14), объясняющий вашу политику конфиденциальности; без него диалоговое окно разрешения не открывается. - В Flutter,
MainActivityдолжен наследовать отFlutterFragmentActivity, а не отFlutterActivity, иначе запросы разрешений завершатся ошибкой.
Чтение ежедневных значений во Flutter
Пакет health обеспечивает доступ к Health Connect на Android и Apple Health на iOS через единый API. В примере используется версия 13.2.1, с которой поставляется Anpheros Daily:
import 'dart:math' as math;
import 'package:health/health.dart';
/// One day of data from Health Connect (Android) or Apple Health (iOS), ready for your backend.
class DailyValue {
DailyValue(this.metric, this.day, this.value, {this.min, this.max});
final String metric; // 'heart_rate', 'steps'
final String day; // '2026-10-01', the user's local day
final double value;
final double? min, max;
Map<String, Object?> toJson() => {'metric': metric, 'day': day, 'value': value, 'min': min, 'max': max};
}
final health = Health();
Future<List<DailyValue>> collectLastDays({int days = 30}) async {
await health.configure();
if (!await health.isHealthConnectAvailable()) {
await health.installHealthConnect(); // opens the Play Store on Android; always available on iOS
return [];
}
const types = [HealthDataType.HEART_RATE, HealthDataType.STEPS];
final granted = await health.requestAuthorization(types, permissions: [HealthDataAccess.READ, HealthDataAccess.READ]);
if (!granted) return [];
final now = DateTime.now();
final out = <DailyValue>[];
for (var i = days - 1; i >= 0; i--) {
final start = DateTime(now.year, now.month, now.day - i); // local midnight, safe across DST changes
final end = DateTime(start.year, start.month, start.day + 1);
final day = start.toIso8601String().substring(0, 10);
final steps = await health.getTotalStepsInInterval(start, end);
if (steps != null) out.add(DailyValue('steps', day, steps.toDouble()));
final samples = await health.getHealthDataFromTypes(types: [HealthDataType.HEART_RATE], startTime: start, endTime: end);
final bpm = [for (final p in samples) if (p.value is NumericHealthValue) (p.value as NumericHealthValue).numericValue.toDouble()];
if (bpm.isNotEmpty) {
out.add(DailyValue('heart_rate', day, bpm.reduce((a, b) => a + b) / bpm.length,
min: bpm.reduce(math.min), max: bpm.reduce(math.max)));
}
}
return out; // POST these to your backend, which writes them to the FHIR record
}
getTotalStepsInInterval запрашивает у Health Connect агрегированное общее значение, которое уже разрешает конфликты между источниками данных (телефон и часы, подсчитывающие одну и ту же прогулку) в соответствии с приоритетом источников данных, установленным пользователем в Health Connect. Суммирование необработанных записей шагов самостоятельно приведет к двойному подсчету.
Заметки по реализации в Anpheros Daily:
- Синхронизация при выходе приложения на передний план, с кратким ограничением против повторных синхронизаций. Другие приложения записывают данные в Health Connect по своему расписанию, поэтому данные, которые пользователь видит в своем приложении от поставщика, могут появиться с задержкой в несколько минут или часов.
- Частота сердечных сокращений — это серия, а не одно значение на образец: суммируйте ее на телефоне (ежедневно или в 4-часовых интервалах для графиков) вместо загрузки каждого показания.
- HRV здесь — RMSSD. Не сохраняйте его под кодом SDNN, используемым для Apple Health.
Из значений Flutter в FHIR Observations
Отправляйте значения на ваш бэкенд и записывайте одно Observation на человека, метрику и день со стабильным идентификатором, обновляя его при повторной отправке того же дня. Полная таблица соответствия (Health Connect record → LOINC → UCUM), валидный пример FHIR и TypeScript upsert, выполненный на платформе, находятся в разделе Wearable data in FHIR.
Публикация в Google Play
Приложения, которые читают данные из Health Connect, должны пройти декларацию разрешений Health Connect в Play Console, обосновать каждый тип данных и иметь соответствующую политику конфиденциальности. Запросы на типы данных, которые приложение явно не использует, отклоняются. Планируйте проверку: перечислите каждый тип рядом с экраном, который его использует.
Wear OS
На часах Wear OS приложение может считывать данные с датчиков в реальном времени через Health Services (например, частоту сердечных сокращений во время тренировки). Данные, которые записывает собственное приложение для здоровья часов, поступают в Health Connect на телефоне через приложение поставщика. Для медицинской записи обычно достаточно считывать данные из Health Connect на телефоне; приложение для часов предназначено для функций реального времени.
Место Anpheros
Платформа Anpheros хранит результат: запись FHIR R4 человека с каждым значением носимого устройства в виде Observation, помеченного как данные устройства, с учетом согласия, происхождения и журнала доступа. Она не читает Health Connect напрямую; это делает ваше Android-приложение. Собственное приложение Anpheros, Anpheros Daily, читает Health Connect на Android (планы Plus и Max) и записывает ежедневные сводки в запись.
Часто задаваемые вопросы
Есть ли у Health Connect облачный API?
Нет. Health Connect хранит данные на телефоне, и только приложения на этом телефоне могут их читать с разрешения пользователя. Чтобы передать данные на сервер, ваше приложение считывает их и отправляет.
Существует ли REST API или веб-API Health Connect?
Нет. Health Connect — это API для устройств Android без конечной точки REST или веб-интерфейса. Сервер получает данные только тогда, когда приложение на телефоне считывает их и отправляет, например, в виде FHIR Observations в Anpheros.
Могу ли я использовать Health Connect API из Python или React Native?
Из Python — нет, потому что он работает на телефоне, а не на сервере. Из React Native или Flutter — да, через плагины сообщества или официальные плагины, которые вызывают Android API внутри приложения.
Почему мое приложение может читать только 30 дней данных Health Connect?
Без разрешения READ_HEALTH_DATA_HISTORY Health Connect ограничивает чтение данными за 30 дней до предоставления первого разрешения. Запросите разрешение на доступ к истории, если вам нужны более старые данные.
Синхронизируется ли Garmin с Health Connect?
Да. Google объявил в августе 2025 года, что Garmin Connect поддерживает Health Connect на Android 14 и более поздних версиях для данных об активности и самочувствии, таких как частота сердечных сокращений и калории. Собственные показатели Garmin, такие как Body Battery, не передаются.
Могу ли я читать данные Fitbit без Fitbit Web API?
На Android — да: как только пользователь включит Health Connect в приложении Fitbit, данные Fitbit станут доступны в Health Connect для авторизованных им приложений.
Почему количество шагов в Health Connect отличается от моего приложения от поставщика?
Приложение от поставщика могло еще не экспортировать свои последние данные, может экспортировать только некоторые типы данных, или Health Connect может предпочесть другой источник для того же периода. Проверьте источники данных и их приоритет в настройках Health Connect.
Связанные материалы
- Прекращение работы Fitbit Web API (октябрь 2026 г.)
- Данные носимых устройств в FHIR: таблица сопоставления и бэкенд-код
- Samsung Health в FHIR
- Apple Health (HealthKit) в FHIR
- Как создать медицинское приложение с помощью Flutter
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card