Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Health Connect a FHIR
Lee datos de Android Health Connect de Fitbit, Garmin, Oura, Withings y Wear OS en Flutter y escríbelos en un registro FHIR R4: permisos, historial, revisión de Play.
Health Connect es el almacén de salud en el dispositivo de Android: las aplicaciones Samsung Health, Fitbit, Garmin Connect, Oura, Withings y Wear OS escriben en él, y tu aplicación lee de él con el permiso de la persona. Para poner esos datos en un registro FHIR, lee los totales y promedios diarios en el teléfono, envíalos a tu backend y escribe cada métrica como una Observation con un código LOINC y una unidad UCUM. Esta página cubre los permisos que requiere Android, un ejemplo de Flutter (verificado con flutter analyze) que lee Health Connect en Android y Apple Health en iOS con el mismo código, y las reglas para publicar en Google Play.
Qué llega a Health Connect
Health Connect está integrado en Android 14 y versiones posteriores, y está disponible como una aplicación en versiones anteriores. Almacena registros como HeartRateRecord, RestingHeartRateRecord, HeartRateVariabilityRmssdRecord, OxygenSaturationRecord, RespiratoryRateRecord, StepsRecord, DistanceRecord, ActiveCaloriesBurnedRecord, SleepSessionRecord, WeightRecord, BloodPressureRecord, BloodGlucoseRecord, BodyTemperatureRecord y ExerciseSessionRecord.
Quién escribe allí, según la documentación de cada proveedor:
| Fuente | Qué esperar |
|---|---|
| Fitbit y Pixel Watch | La aplicación Fitbit se sincroniza con Health Connect una vez que la persona la configura (Ayuda de Google) |
| Garmin | Garmin Connect es compatible con Health Connect en Android 14 y versiones posteriores: datos de actividad y bienestar como frecuencia cardíaca y calorías (Android Developers, agosto de 2025) |
| Oura | Frecuencia cardíaca, HRV, sueño con etapas, pasos, distancia, calorías y entrenamientos (Oura) |
| Withings | Health Mate intercambia datos de actividad, peso, sueño y otros a través de Health Connect (Blog de Android Developers) |
| Samsung Health, Galaxy Watch | Un subconjunto, al ritmo de Samsung Health; consulta Samsung Health a FHIR |
Cada aplicación de proveedor debe tener permiso para escribir en Health Connect, lo cual la persona concede en esa aplicación o en la configuración de Health Connect. Si falta una fuente, eso es lo primero que se debe comprobar.
Permisos que Android requiere
- Un permiso por tipo de registro y dirección, por ejemplo
android.permission.health.READ_HEART_RATEyandroid.permission.health.READ_STEPS, declarado en el manifiesto y solicitado en tiempo de ejecución. - Historial: sin
android.permission.health.READ_HEALTH_DATA_HISTORY, una aplicación solo puede leer los últimos 30 días anteriores a la concesión del permiso. - Segundo plano: leer mientras la aplicación no está en primer plano requiere
android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND. - Una pantalla de justificación de permisos (una actividad que maneja
ACTION_SHOW_PERMISSIONS_RATIONALE, más un alias de actividad en Android 14) que explica su política de privacidad; sin ella, el diálogo de permisos no se abre. - En Flutter, el
MainActivitydebe extenderFlutterFragmentActivity, noFlutterActivity, o las solicitudes de permisos fallarán.
Lectura de valores diarios en Flutter
El paquete health lee Health Connect en Android y Apple Health en iOS detrás de una única API. El ejemplo utiliza la versión 13.2.1, la que Anpheros Daily envía con:
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 solicita a Health Connect su total agregado, que ya resuelve fuentes superpuestas (un teléfono y un reloj contando el mismo paseo) según la prioridad de la fuente de datos que la persona estableció en Health Connect. Sumar registros de pasos brutos por sí mismo genera recuentos duplicados.
Notas de la implementación en Anpheros Daily:
- Sincronizar cuando la aplicación pasa a primer plano, con una breve protección contra sincronizaciones repetidas. Otras aplicaciones escriben en Health Connect en su propio horario, por lo que los datos que una persona ve en su aplicación del proveedor pueden llegar minutos u horas después.
- La frecuencia cardíaca es una serie, no un valor por muestra: resúmala en el teléfono (diariamente o en ventanas de 4 horas para gráficos) en lugar de cargar cada lectura.
- HRV aquí es RMSSD. No lo almacene bajo el código SDNN utilizado para Apple Health.
De valores de Flutter a Observaciones FHIR
Envía los valores a tu backend y escribe una Observación por persona, métrica y día con un identificador estable, actualizándola cuando se envíe el mismo día de nuevo. La tabla de mapeo completa (registro de Health Connect → LOINC → UCUM), un ejemplo FHIR validado y la ejecución de upsert de TypeScript contra la plataforma se encuentran en Datos de wearables en FHIR.
Publicación en Google Play
Las aplicaciones que leen Health Connect deben completar la declaración de permisos de Health Connect en la Play Console, justificar cada tipo de dato y tener una política de privacidad que coincida. Las solicitudes de tipos de datos que la aplicación no utiliza visiblemente son rechazadas. Planifique la revisión: enumere cada tipo junto con la pantalla que lo utiliza.
Wear OS
En un reloj Wear OS, una aplicación puede leer datos de sensores en vivo a través de Health Services (por ejemplo, la frecuencia cardíaca durante un entrenamiento). Los datos que registra la propia aplicación de salud del reloj llegan a Health Connect del teléfono a través de la aplicación del proveedor en el teléfono. Para un registro médico, leer Health Connect en el teléfono suele ser suficiente; una aplicación de reloj es para funciones en vivo.
Dónde encaja Anpheros
La Plataforma Anpheros almacena el resultado: el registro FHIR R4 de la persona con cada valor del dispositivo wearable como una Observation marcada como datos del dispositivo, detrás de un consentimiento, procedencia y un registro de acceso. No lee Health Connect directamente; tu aplicación Android lo hace. La propia aplicación de Anpheros, Anpheros Daily, lee Health Connect en Android (planes Plus y Max) y escribe resúmenes diarios en el registro.
Preguntas frecuentes
¿Health Connect tiene una API en la nube?
No. Health Connect almacena datos en el teléfono, y solo las aplicaciones de ese teléfono pueden leerlos, con el permiso de la persona. Para enviar los datos a un servidor, tu aplicación los lee y los envía.
¿Existe una API REST o web de Health Connect?
No. Health Connect es una API de Android en el dispositivo sin un punto final REST o web. Un servidor recibe los datos solo cuando una aplicación en el teléfono los lee y los envía, por ejemplo, como Observaciones FHIR a Anpheros.
¿Puedo usar la API de Health Connect desde Python o React Native?
No desde Python, porque se ejecuta en el teléfono, no en un servidor. Desde React Native o Flutter, sí, a través de plugins comunitarios u oficiales que llaman a la API de Android dentro de la aplicación.
¿Por qué mi aplicación solo puede leer 30 días de datos de Health Connect?
Sin el permiso READ_HEALTH_DATA_HISTORY, Health Connect limita las lecturas a 30 días antes de que se otorgara el primer permiso. Solicita el permiso de historial si necesitas datos más antiguos.
¿Garmin se sincroniza con Health Connect?
Sí. Google anunció en agosto de 2025 que Garmin Connect es compatible con Health Connect en Android 14 y versiones posteriores, para datos de actividad y bienestar como la frecuencia cardíaca y las calorías. Las propias puntuaciones de Garmin, como Body Battery, no se comparten.
¿Puedo leer datos de Fitbit sin la API web de Fitbit?
En Android, sí: una vez que la persona habilita Health Connect en la aplicación Fitbit, los datos de Fitbit están disponibles en Health Connect para las aplicaciones que autoricen.
¿Por qué el recuento de pasos de Health Connect difiere de mi aplicación del proveedor?
La aplicación del proveedor puede no haber exportado sus datos más recientes todavía, puede exportar solo algunos tipos, o Health Connect puede preferir otra fuente para el mismo período. Comprueba las fuentes de datos y su prioridad en la configuración de Health Connect.
Relacionado
- Cierre de la API web de Fitbit (octubre de 2026)
- Datos de wearables en FHIR: la tabla de mapeo y el código de backend
- Samsung Health a FHIR
- Apple Health (HealthKit) a FHIR
- Cómo crear una aplicación de atención médica con Flutter
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card