# Health Connect to FHIR

> Leggi i dati di Android Health Connect da Fitbit, Garmin, Oura, Withings e Wear OS in Flutter e scrivili in un record FHIR R4: permessi, cronologia, revisione Play.

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

**Health Connect è lo store di salute on-device di Android: le app Samsung Health, Fitbit, Garmin Connect, Oura, Withings e Wear OS scrivono al suo interno, e la tua app legge da esso con il permesso della persona.** Per inserire questi dati in un record FHIR, leggi i totali giornalieri e le medie sul telefono, inviali al tuo backend e scrivi ogni metrica come un Observation con un codice LOINC e un'unità UCUM. Questa pagina copre i permessi richiesti da Android, un esempio Flutter (verificato con `flutter analyze`) che legge Health Connect su Android e Apple Health su iOS con lo stesso codice, e le regole per la pubblicazione su Google Play.

## Cosa raggiunge Health Connect

Health Connect è integrato in Android 14 e versioni successive ed è disponibile come app su versioni precedenti. Memorizza record quali `HeartRateRecord`, `RestingHeartRateRecord`, `HeartRateVariabilityRmssdRecord`, `OxygenSaturationRecord`, `RespiratoryRateRecord`, `StepsRecord`, `DistanceRecord`, `ActiveCaloriesBurnedRecord`, `SleepSessionRecord`, `WeightRecord`, `BloodPressureRecord`, `BloodGlucoseRecord`, `BodyTemperatureRecord` e `ExerciseSessionRecord`.

Chi scrive lì, secondo la documentazione di ciascun fornitore:

| Sorgente | Cosa aspettarsi |
|---|---|
| Fitbit e Pixel Watch | L'app Fitbit si sincronizza con Health Connect una volta che l'utente l'ha configurata ([Guida Google](https://support.google.com/fitbit/answer/14506680)) |
| Garmin | Garmin Connect supporta Health Connect su Android 14 e versioni successive: dati di attività e benessere come frequenza cardiaca e calorie ([Android Developers, agosto 2025](https://developer.android.com/health-and-fitness/community/newsletters/2025/08)) |
| Oura | Frequenza cardiaca, HRV, sonno con fasi, passi, distanza, calorie e allenamenti ([Oura](https://ouraring.com/blog/data-sharing-partner-integrations/)) |
| Withings | Health Mate scambia dati di attività, peso, sonno e altri dati tramite Health Connect ([Blog 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 | Un sottoinsieme, al ritmo di Samsung Health — vedi [Samsung Health to FHIR](https://developers.anpheros.com/it/guides/samsung-health-fhir) |

Ogni app del fornitore deve avere il permesso di **scrivere** su Health Connect, che l'utente concede in quell'app o nelle impostazioni di Health Connect. Se una sorgente è mancante, questa è la prima cosa da controllare.

## Permessi richiesti da Android

- Un permesso per tipo di record e direzione, ad esempio `android.permission.health.READ_HEART_RATE` e `android.permission.health.READ_STEPS`, dichiarato nel manifest e richiesto al runtime.
- **Cronologia:** senza `android.permission.health.READ_HEALTH_DATA_HISTORY`, un'app può leggere solo gli ultimi 30 giorni prima che il permesso venga concesso.
- **In background:** la lettura mentre l'app non è in primo piano richiede `android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND`.
- Una schermata di **motivazione dei permessi** (un'activity che gestisce `ACTION_SHOW_PERMISSIONS_RATIONALE`, più un alias di activity su Android 14) che spiega la tua privacy policy; senza di essa la finestra di dialogo dei permessi non si apre.
- In Flutter, il `MainActivity` deve estendere `FlutterFragmentActivity`, non `FlutterActivity`, altrimenti le richieste di permesso falliranno.

## Lettura dei valori giornalieri in Flutter

Il pacchetto [`health`](https://pub.dev/packages/health) legge Health Connect su Android e Apple Health su iOS dietro un'unica API. L'esempio utilizza la versione 13.2.1, quella con cui Anpheros Daily viene spedito:

```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` richiede a Health Connect il suo totale aggregato, che già risolve le fonti sovrapposte (un telefono e un orologio che contano la stessa camminata) in base alla priorità della sorgente dati impostata dalla persona in Health Connect. Sommare manualmente i record dei passi grezzi causa un doppio conteggio.

Note dalla distribuzione di questa funzionalità in Anpheros Daily:

- **Sincronizza quando l'app va in primo piano**, con una breve protezione contro sincronizzazioni ripetute. Altre app scrivono su Health Connect secondo la propria pianificazione, quindi i dati che una persona vede nella propria app del fornitore potrebbero arrivare minuti o ore dopo.
- **La frequenza cardiaca è una serie**, non un singolo valore per campione: riassumila sul telefono (giornalmente o in finestre di 4 ore per i grafici) invece di caricare ogni lettura.
- **L'HRV qui è RMSSD.** Non memorizzarlo sotto il codice SDNN utilizzato per Apple Health.

## Dai valori Flutter alle Osservazioni FHIR

Invia i valori al tuo backend e scrivi una Osservazione per persona, metrica e giorno con un identificatore stabile, aggiornandola quando lo stesso giorno viene inviato nuovamente. La tabella di mappatura completa (record Health Connect → LOINC → UCUM), un esempio FHIR validato e l'esecuzione di upsert TypeScript contro la piattaforma sono disponibili su [Wearable data in FHIR](https://developers.anpheros.com/it/guides/wearable-data-fhir).

## Pubblicazione su Google Play

Le app che leggono Health Connect devono completare la dichiarazione delle autorizzazioni di Health Connect nella Play Console, giustificare ogni tipo di dato e avere una privacy policy corrispondente. Le richieste di tipi di dati che l'app non utilizza visibilmente vengono rifiutate. Pianifica la revisione: elenca ogni tipo accanto allo schermo che lo utilizza.

## Wear OS

Su uno smartwatch Wear OS, un'app può leggere dati dei sensori in tempo reale tramite Health Services (ad esempio, la frequenza cardiaca durante un allenamento). I dati registrati dall'app salute dello smartwatch raggiungono Health Connect sul telefono tramite l'app del produttore per telefono. Per una cartella clinica, leggere Health Connect sul telefono è solitamente sufficiente; un'app per smartwatch è destinata a funzionalità in tempo reale.

## Dove si inserisce Anpheros

La Piattaforma Anpheros memorizza il risultato: il record FHIR R4 della persona con ogni valore del dispositivo indossabile come Observation contrassegnato come dati del dispositivo, dietro consenso, provenienza e un log di accesso. Non legge Health Connect di per sé; lo fa la tua app Android. L'app di Anpheros, **Anpheros Daily**, legge Health Connect su Android (piani Plus e Max) e scrive riepiloghi giornalieri nel record.

## Domande frequenti

### Health Connect dispone di un'API cloud?
No. Health Connect memorizza i dati sul telefono e solo le app su quel telefono possono leggerli, con il permesso della persona. Per inviare i dati a un server, la tua app li legge e li invia.

### Esiste un'API REST o un'API web di Health Connect?
No. Health Connect è un'API Android on-device senza endpoint REST o web. Un server riceve i dati solo quando un'app sul telefono li legge e li invia, ad esempio come FHIR Observations ad Anpheros.

### Posso utilizzare l'API Health Connect da Python o React Native?
Non da Python, perché viene eseguito sul telefono, non su un server. Da React Native o Flutter, sì, tramite plugin community o ufficiali che chiamano l'API Android all'interno dell'app.

### Perché la mia app può leggere solo 30 giorni di dati Health Connect?
Senza il permesso `READ_HEALTH_DATA_HISTORY`, Health Connect limita le letture a 30 giorni prima che venga concesso il primo permesso. Richiedi il permesso di cronologia se hai bisogno di dati più vecchi.

### Garmin si sincronizza con Health Connect?
Sì. Google ha annunciato nell'agosto 2025 che Garmin Connect supporta Health Connect su Android 14 e versioni successive, per dati di attività e benessere come frequenza cardiaca e calorie. I punteggi propri di Garmin, come Body Battery, non vengono condivisi.

### Posso leggere i dati Fitbit senza l'API Web Fitbit?
Su Android, sì: una volta che la persona abilita Health Connect nell'app Fitbit, i dati Fitbit sono disponibili in Health Connect per le app che autorizza.

### Perché il conteggio dei passi di Health Connect differisce dalla mia app del fornitore?
L'app del fornitore potrebbe non aver ancora esportato i suoi dati più recenti, potrebbe esportare solo alcuni tipi, oppure Health Connect potrebbe preferire un'altra origine per lo stesso periodo. Controlla le origini dati e la loro priorità nelle impostazioni di Health Connect.

## Correlati

- [Chiusura della Fitbit Web API (ottobre 2026)](https://developers.anpheros.com/it/guides/fitbit-web-api-shutdown)
- [Dati indossabili in FHIR](https://developers.anpheros.com/it/guides/wearable-data-fhir): la tabella di mappatura e il codice backend
- [Samsung Health in FHIR](https://developers.anpheros.com/it/guides/samsung-health-fhir)
- [Apple Health (HealthKit) in FHIR](https://developers.anpheros.com/it/guides/apple-health-fhir)
- [Come creare un'app sanitaria con Flutter](https://developers.anpheros.com/it/guides/healthcare-app-flutter)
