# Health Connect para FHIR

> Leia dados do Android Health Connect de Fitbit, Garmin, Oura, Withings e Wear OS em Flutter e escreva-os num registo FHIR R4: permissões, histórico, revisão do Play.

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

**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](https://support.google.com/fitbit/answer/14506680)) |
| 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](https://developer.android.com/health-and-fitness/community/newsletters/2025/08)) |
| Oura | Frequência cardíaca, VFC (Variabilidade da Frequência Cardíaca), sono com fases, passos, distância, calorias e treinos ([Oura](https://ouraring.com/blog/data-sharing-partner-integrations/)) |
| Withings | O Health Mate troca dados de atividade, peso, sono e outros através do 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 | Um subconjunto, ao ritmo do Samsung Health — ver [Samsung Health para FHIR](https://developers.anpheros.com/pt/guides/samsung-health-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_RATE` e `android.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 `MainActivity` deve estender `FlutterFragmentActivity`, não `FlutterActivity`, caso contrário, os pedidos de permissão falham.

## Ler valores diários em Flutter

O pacote [`health`](https://pub.dev/packages/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:

```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
}
```

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](https://developers.anpheros.com/pt/guides/wearable-data-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)](https://developers.anpheros.com/pt/guides/fitbit-web-api-shutdown)
- [Dados de wearables em FHIR](https://developers.anpheros.com/pt/guides/wearable-data-fhir): a tabela de mapeamento e o código de backend
- [Samsung Health para FHIR](https://developers.anpheros.com/pt/guides/samsung-health-fhir)
- [Apple Health (HealthKit) para FHIR](https://developers.anpheros.com/pt/guides/apple-health-fhir)
- [Como criar uma aplicação de saúde com Flutter](https://developers.anpheros.com/guides/healthcare-app-flutter)
