Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Health Connect para FHIR
Ler dados do Android Health Connect de Fitbit, Garmin, Oura, Withings e Wear OS em Flutter e gravá-los num registo FHIR R4: permissões, histórico, revisão na Play Store.
Health Connect é a loja de saúde no dispositivo do Android: Samsung Health, Fitbit, Garmin Connect, Oura, Withings e aplicações Wear OS escrevem nele, e a sua aplicação lê a partir dele com a permissão da pessoa. Para colocar esses dados num registo FHIR, leia totais diários e médias no telemóvel, envie-os para o seu backend e escreva cada métrica como uma Observation com um código LOINC e uma unidade UCUM. Esta página abrange as permissões que o Android requer, um exemplo em Flutter (verificado com flutter analyze) que lê o Health Connect no Android e o Apple Health no iOS com o mesmo código, e as regras para publicação no Google Play.
O que chega ao Health Connect
O Health Connect está integrado no Android 14 e versões posteriores e disponível como uma aplicação em versões mais antigas. Armazena registos como HeartRateRecord, RestingHeartRateRecord, HeartRateVariabilityRmssdRecord, OxygenSaturationRecord, RespiratoryRateRecord, StepsRecord, DistanceRecord, ActiveCaloriesBurnedRecord, SleepSessionRecord, WeightRecord, BloodPressureRecord, BloodGlucoseRecord, BodyTemperatureRecord e ExerciseSessionRecord.
Quem escreve lá, de acordo com a documentação de cada fornecedor:
| Origem | O que esperar |
|---|---|
| Fitbit e Pixel Watch | A aplicação Fitbit sincroniza com o Health Connect assim que a pessoa a configurar (Ajuda do Google) |
| Garmin | O Garmin Connect suporta o Health Connect no Android 14 e versões posteriores: dados de atividade e bem-estar como frequência cardíaca e calorias (Android Developers, agosto de 2025) |
| Oura | Frequência cardíaca, VFC (Variabilidade da Frequência Cardíaca), sono com fases, passos, distância, calorias e treinos (Oura) |
| Withings | O Health Mate troca dados de atividade, peso, sono e outros através do Health Connect (Blog Android Developers) |
| Samsung Health, Galaxy Watch | Um subconjunto, ao ritmo do Samsung Health — ver Samsung Health para FHIR |
Cada aplicação de fornecedor tem de ter permissão para escrever no Health Connect, o que a pessoa concede nessa aplicação ou nas definições do Health Connect. Se uma origem estiver em falta, essa é a primeira coisa a verificar.
Permissões que o Android requer
- Uma permissão por tipo de registo e direção, por exemplo
android.permission.health.READ_HEART_RATEeandroid.permission.health.READ_STEPS, declarada no manifesto e solicitada em tempo de execução. - Histórico: sem
android.permission.health.READ_HEALTH_DATA_HISTORY, uma aplicação só pode ler os últimos 30 dias antes de a permissão ser concedida. - Em segundo plano: a leitura enquanto a aplicação não está em primeiro plano necessita de
android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND. - Um ecrã de justificação de permissões (uma atividade que gere
ACTION_SHOW_PERMISSIONS_RATIONALE, mais um alias de atividade no Android 14) que explique a sua política de privacidade; sem ele, a caixa de diálogo de permissão não abre. - Em Flutter, o
MainActivitydeve estenderFlutterFragmentActivity, nãoFlutterActivity, caso contrário, os pedidos de permissão falham.
Ler valores diários em Flutter
O pacote health lê o Health Connect no Android e o Apple Health no iOS por trás de uma única API. O exemplo utiliza a versão 13.2.1, com a qual o Anpheros Daily é fornecido:
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
}
O getTotalStepsInInterval solicita ao Health Connect o seu total agregado, que já resolve fontes sobrepostas (um telemóvel e um relógio a contar a mesma caminhada) de acordo com a prioridade da fonte de dados definida pela pessoa no Health Connect. Somar registos de passos brutos por si só resulta em contagem dupla.
Notas da implementação no Anpheros Daily:
- Sincronizar quando a aplicação vai para o primeiro plano, com uma pequena proteção contra sincronizações repetidas. Outras aplicações escrevem no Health Connect no seu próprio horário, pelo que os dados que uma pessoa vê na sua aplicação de fornecedor podem chegar minutos ou horas mais tarde.
- A frequência cardíaca é uma série, não um valor por amostra: resumi-la no telemóvel (diariamente, ou em janelas de 4 horas para gráficos) em vez de carregar cada leitura.
- O HRV aqui é RMSSD. Não o armazenar sob o código SDNN utilizado para o Apple Health.
Dos valores do Flutter para Observações FHIR
Envie os valores para o seu backend e escreva uma Observação por pessoa, métrica e dia com um identificador estável, atualizando-a quando o mesmo dia for enviado novamente. A tabela de mapeamento completa (registo Health Connect → LOINC → UCUM), um exemplo FHIR validado e a execução de upsert TypeScript contra a plataforma estão em Dados vestíveis em FHIR.
Publicação no Google Play
As aplicações que leem o Health Connect devem completar a declaração de permissões do Health Connect na Play Console, justificar cada tipo de dados e ter uma política de privacidade correspondente. Os pedidos de tipos de dados que a aplicação não utiliza visivelmente são rejeitados. Planeie a revisão: liste cada tipo ao lado do ecrã que o utiliza.
Wear OS
Num relógio Wear OS, uma aplicação pode ler dados de sensores em tempo real através dos Health Services (frequência cardíaca durante um treino, por exemplo). Os dados que a aplicação de saúde do próprio relógio regista chegam ao Health Connect do telemóvel através da aplicação do fornecedor no telemóvel. Para um registo médico, ler o Health Connect no telemóvel é geralmente suficiente; uma aplicação de relógio destina-se a funcionalidades em tempo real.
Onde o Anpheros se encaixa
A Plataforma Anpheros armazena o resultado: o registo FHIR R4 da pessoa com cada valor de wearable como uma Observation marcada como dados de dispositivo, protegida por consentimento, proveniência e um registo de acesso. Não lê o Health Connect em si; a sua aplicação Android é que o faz. A própria aplicação do Anpheros, Anpheros Daily, lê o Health Connect no Android (planos Plus e Max) e escreve resumos diários no registo.
Perguntas frequentes
O Health Connect tem uma API na nuvem?
Não. O Health Connect armazena dados no telemóvel, e apenas as aplicações nesse telemóvel podem lê-los, com a permissão da pessoa. Para enviar os dados para um servidor, a sua aplicação lê-os e envia-os.
Existe uma API REST ou API web do Health Connect?
Não. O Health Connect é uma API Android no dispositivo, sem um ponto final REST ou web. Um servidor recebe os dados apenas quando uma aplicação no telemóvel os lê e os envia, por exemplo, como Observações FHIR para o Anpheros.
Posso usar a API do Health Connect a partir de Python ou React Native?
Não a partir de Python, porque corre no telemóvel, não num servidor. A partir de React Native ou Flutter, sim, através de plugins da comunidade ou oficiais que chamam a API Android dentro da aplicação.
Por que é que a minha aplicação só consegue ler 30 dias de dados do Health Connect?
Sem a permissão READ_HEALTH_DATA_HISTORY, o Health Connect limita as leituras a 30 dias antes da concessão da primeira permissão. Solicite a permissão de histórico se precisar de dados mais antigos.
O Garmin sincroniza com o Health Connect?
Sim. O Google anunciou em agosto de 2025 que o Garmin Connect suporta o Health Connect no Android 14 e posterior, para dados de atividade e bem-estar, como frequência cardíaca e calorias. As pontuações próprias do Garmin, como a Body Battery, não são partilhadas.
Posso ler dados do Fitbit sem a API Web do Fitbit?
No Android, sim: depois de a pessoa ativar o Health Connect na aplicação Fitbit, os dados do Fitbit ficam disponíveis no Health Connect para as aplicações que autorizar.
Por que é que a contagem de passos do Health Connect difere da minha aplicação do fornecedor?
A aplicação do fornecedor pode ainda não ter exportado os seus dados mais recentes, pode exportar apenas alguns tipos, ou o Health Connect pode preferir outra fonte para o mesmo período. Verifique as fontes de dados e a sua prioridade nas definições do Health Connect.
Relacionado
- Desativação da API Web do Fitbit (outubro de 2026)
- Dados de wearables em FHIR: a tabela de mapeamento e o código de backend
- Samsung Health para FHIR
- Apple Health (HealthKit) para FHIR
- Como criar uma aplicação de saúde com Flutter
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card