Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Health Connect in FHIR
Leggi dati da Android Health Connect di Fitbit, Garmin, Oura, Withings e Wear OS in Flutter e scrivili in un record FHIR R4: permessi, cronologia, revisione Play Store.
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) |
| 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) |
| Oura | Frequenza cardiaca, HRV, sonno con fasi, passi, distanza, calorie e allenamenti (Oura) |
| Withings | Health Mate scambia dati di attività, peso, sonno e altri dati tramite Health Connect (Blog Android Developers) |
| Samsung Health, Galaxy Watch | Un sottoinsieme, al ritmo di Samsung Health — vedi Samsung Health to 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_RATEeandroid.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
MainActivitydeve estendereFlutterFragmentActivity, nonFlutterActivity, altrimenti le richieste di permesso falliranno.
Lettura dei valori giornalieri in Flutter
Il pacchetto 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:
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.
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)
- Dati indossabili in FHIR: la tabella di mappatura e il codice backend
- Samsung Health in FHIR
- Apple Health (HealthKit) in FHIR
- Come creare un'app sanitaria con Flutter
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card