# Health Connect до FHIR

> Читайте дані Android Health Connect з Fitbit, Garmin, Oura, Withings та Wear OS у Flutter і записуйте їх до запису FHIR R4: дозволи, історія, огляд Play.

Source: https://developers.anpheros.com/uk/guides/health-connect-fhir

**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](https://support.google.com/fitbit/answer/14506680)) |
| Garmin | Garmin Connect підтримує Health Connect на Android 14 і новіших версіях: дані про активність та самопочуття, такі як пульс і калорії ([Android Developers, серпень 2025](https://developer.android.com/health-and-fitness/community/newsletters/2025/08)) |
| Oura | Пульс, ВСР, сон з фазами, кроки, відстань, калорії та тренування ([Oura](https://ouraring.com/blog/data-sharing-partner-integrations/)) |
| Withings | Health Mate обмінюється даними про активність, вагу, сон та іншими даними через Health Connect ([Блог Android Developers](https://android-developers.googleblog.com/2023/03/withings-reduces-data-sync-code-with--health-and-fitness-api-health-connect.html)) |
| Samsung Health, Galaxy Watch | Підмножина даних, у власному темпі Samsung Health — див. [Samsung Health до FHIR](https://developers.anpheros.com/uk/guides/samsung-health-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`](https://pub.dev/packages/health) читає Health Connect на Android та Apple Health на iOS через один API. Приклад використовує версію 13.2.1, з якою постачається Anpheros Daily:

```dart
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](https://developers.anpheros.com/uk/guides/wearable-data-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 — це Android API, що працює на пристрої, без кінцевої точки 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 року)](https://developers.anpheros.com/uk/guides/fitbit-web-api-shutdown)
- [Дані з носимих пристроїв у FHIR](https://developers.anpheros.com/uk/guides/wearable-data-fhir): таблиця зіставлення та бекенд-код
- [Samsung Health до FHIR](https://developers.anpheros.com/uk/guides/samsung-health-fhir)
- [Apple Health (HealthKit) до FHIR](https://developers.anpheros.com/uk/guides/apple-health-fhir)
- [Як створити медичний додаток за допомогою Flutter](https://developers.anpheros.com/uk/guides/healthcare-app-flutter)
