# Health Connect σε FHIR

> Διαβάστε δεδομένα Android Health Connect από Fitbit, Garmin, Oura, Withings και Wear OS σε Flutter και γράψτε τα σε ένα αρχείο FHIR R4: δικαιώματα, ιστορικό, αναθεώρηση Play.

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

**Το Health Connect είναι το on-device κατάστημα υγείας του Android: οι εφαρμογές Samsung Health, Fitbit, Garmin Connect, Oura, Withings και Wear OS γράφουν σε αυτό, και η εφαρμογή σας διαβάζει από αυτό με την άδεια του ατόμου.** Για να βάλετε αυτά τα δεδομένα σε ένα αρχείο FHIR, διαβάστε καθημερινά σύνολα και μέσους όρους στο τηλέφωνο, στείλτε τα στο backend σας και γράψτε κάθε μετρική ως Observation με κωδικό LOINC και μονάδα UCUM. Αυτή η σελίδα καλύπτει τα δικαιώματα που απαιτεί το Android, ένα παράδειγμα Flutter (ελεγμένο με `flutter analyze`) που διαβάζει Health Connect σε Android και Apple Health σε iOS με τον ίδιο κώδικα, και τους κανόνες για τη δημοσίευση στο Google Play.

## Τι φτάνει στο Health Connect

Το Health Connect είναι ενσωματωμένο στο Android 14 και νεότερες εκδόσεις και διατίθεται ως εφαρμογή σε παλαιότερες εκδόσεις. Διατηρεί αρχεία όπως `HeartRateRecord`, `RestingHeartRateRecord`, `HeartRateVariabilityRmssdRecord`, `OxygenSaturationRecord`, `RespiratoryRateRecord`, `StepsRecord`, `DistanceRecord`, `ActiveCaloriesBurnedRecord`, `SleepSessionRecord`, `WeightRecord`, `BloodPressureRecord`, `BloodGlucoseRecord`, `BodyTemperatureRecord` και `ExerciseSessionRecord`.

Ποιος γράφει εκεί, σύμφωνα με την τεκμηρίωση κάθε παρόχου:

| Πηγή | Τι να περιμένετε |
|---|---|
| Fitbit και Pixel Watch | Η εφαρμογή Fitbit συγχρονίζεται με το Health Connect μόλις το ρυθμίσει το άτομο ([Βοήθεια Google](https://support.google.com/fitbit/answer/14506680)) |
| Garmin | Το Garmin Connect υποστηρίζει το Health Connect σε Android 14 και νεότερες εκδόσεις: δεδομένα δραστηριότητας και ευεξίας όπως καρδιακός ρυθμός και θερμίδες ([Android Developers, Αύγουστος 2025](https://developer.android.com/health-and-fitness/community/newsletters/2025/08)) |
| Oura | Καρδιακός ρυθμός, HRV, ύπνος με στάδια, βήματα, απόσταση, θερμίδες και προπονήσεις ([Oura](https://ouraring.com/blog/data-sharing-partner-integrations/)) |
| Withings | Το Health Mate ανταλλάσσει δεδομένα δραστηριότητας, βάρους, ύπνου και άλλα μέσω του 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 | Ένα υποσύνολο, με τον δικό του ρυθμό του Samsung Health — δείτε [Samsung Health σε FHIR](https://developers.anpheros.com/el/guides/samsung-health-fhir) |

Κάθε εφαρμογή παρόχου πρέπει να έχει άδεια **εγγραφής** στο Health Connect, την οποία χορηγεί το άτομο σε αυτήν την εφαρμογή ή στις ρυθμίσεις του Health Connect. Εάν λείπει μια πηγή, αυτό είναι το πρώτο πράγμα που πρέπει να ελέγξετε.

## Απαιτούμενες άδειες για Android

- Μία άδεια ανά τύπο εγγραφής και κατεύθυνση, για παράδειγμα `android.permission.health.READ_HEART_RATE` και `android.permission.health.READ_STEPS`, δηλωμένη στο manifest και ζητούμενη κατά την εκτέλεση.
- **Ιστορικό:** χωρίς `android.permission.health.READ_HEALTH_DATA_HISTORY`, μια εφαρμογή μπορεί να διαβάσει μόνο τις τελευταίες 30 ημέρες πριν χορηγηθεί η άδεια.
- **Παρασκήνιο:** η ανάγνωση ενώ η εφαρμογή δεν είναι στο προσκήνιο απαιτεί `android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND`.
- Μια οθόνη **αιτιολόγησης αδειών** (μια δραστηριότητα που χειρίζεται το `ACTION_SHOW_PERMISSIONS_RATIONALE`, συν ένα ψευδώνυμο δραστηριότητας στο Android 14) που εξηγεί την πολιτική απορρήτου σας· χωρίς αυτήν, ο διάλογος αδειών δεν ανοίγει.
- Στο Flutter, το `MainActivity` πρέπει να επεκτείνει το `FlutterFragmentActivity`, όχι το `FlutterActivity`, αλλιώς τα αιτήματα αδειών αποτυγχάνουν.

## Ανάγνωση ημερήσιων τιμών σε Flutter

Το πακέτο [`health`](https://pub.dev/packages/health) διαβάζει το Health Connect σε Android και το Apple Health σε iOS πίσω από ένα API. Το παράδειγμα χρησιμοποιεί την έκδοση 13.2.1, την οποία συνοδεύει το Anpheros Daily:

```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` ζητά από το Health Connect το συγκεντρωτικό του σύνολο, το οποίο ήδη επιλύει επικαλυπτόμενες πηγές (ένα τηλέφωνο και ένα ρολόι που μετρούν την ίδια βόλτα) σύμφωνα με την προτεραιότητα πηγής δεδομένων που έχει ορίσει το άτομο στο Health Connect. Το άθροισμα ακατέργαστων εγγραφών βημάτων από μόνοι σας οδηγεί σε διπλή μέτρηση.

Σημειώσεις από την αποστολή αυτού του χαρακτηριστικού στο Anpheros Daily:

- **Συγχρονισμός όταν η εφαρμογή έρχεται στο προσκήνιο**, με μια σύντομη προστασία έναντι επαναλαμβανόμενων συγχρονισμών. Άλλες εφαρμογές γράφουν στο Health Connect σύμφωνα με το δικό τους πρόγραμμα, επομένως τα δεδομένα που βλέπει ένα άτομο στην εφαρμογή του προμηθευτή του μπορεί να φτάσουν λεπτά ή ώρες αργότερα.
- **Ο καρδιακός ρυθμός είναι μια σειρά**, όχι μία τιμή ανά δείγμα: συνοψίστε τον στο τηλέφωνο (ημερησίως ή σε παράθυρα 4 ωρών για γραφήματα) αντί να ανεβάζετε κάθε ανάγνωση.
- **Το HRV εδώ είναι RMSSD.** Μην το αποθηκεύετε κάτω από τον κωδικό SDNN που χρησιμοποιείται για το Apple Health.

## Από τιμές Flutter σε FHIR Observations

Στείλτε τις τιμές στο backend σας και γράψτε ένα Observation ανά άτομο, μετρική και ημέρα με ένα σταθερό αναγνωριστικό, ενημερώνοντάς το όταν ξανασταλεί η ίδια ημέρα. Ο πλήρης πίνακας αντιστοίχισης (Health Connect record → LOINC → UCUM), ένα επικυρωμένο παράδειγμα FHIR και η εκτέλεση upsert TypeScript έναντι της πλατφόρμας βρίσκονται στο [Wearable data in FHIR](https://developers.anpheros.com/el/guides/wearable-data-fhir).

## Δημοσίευση στο Google Play

Οι εφαρμογές που διαβάζουν Health Connect πρέπει να ολοκληρώσουν τη δήλωση δικαιωμάτων Health Connect στην Play Console, να αιτιολογήσουν κάθε τύπο δεδομένων και να διαθέτουν μια αντίστοιχη πολιτική απορρήτου. Τα αιτήματα για τύπους δεδομένων που η εφαρμογή δεν χρησιμοποιεί ορατά απορρίπτονται. Σχεδιάστε για την αναθεώρηση: καταγράψτε κάθε τύπο δίπλα στην οθόνη που τον χρησιμοποιεί.

## Wear OS

Σε ένα ρολόι Wear OS, μια εφαρμογή μπορεί να διαβάζει δεδομένα αισθητήρων σε πραγματικό χρόνο μέσω των Health Services (για παράδειγμα, καρδιακός ρυθμός κατά τη διάρκεια μιας προπόνησης). Τα δεδομένα που καταγράφει η δική του εφαρμογή υγείας του ρολογιού φτάνουν στο Health Connect του τηλεφώνου μέσω της εφαρμογής τηλεφώνου του κατασκευαστή. Για ένα ιατρικό αρχείο, η ανάγνωση του Health Connect στο τηλέφωνο είναι συνήθως επαρκής· μια εφαρμογή ρολογιού προορίζεται για λειτουργίες σε πραγματικό χρόνο.

## Πού εντάσσεται το Anpheros

Η πλατφόρμα Anpheros αποθηκεύει το αποτέλεσμα: το αρχείο FHIR R4 του ατόμου με κάθε τιμή φορητής συσκευής ως Παρατήρηση (Observation) που σημειώνεται ως δεδομένα συσκευής, πίσω από συναίνεση, προέλευση και αρχείο καταγραφής πρόσβασης. Δεν διαβάζει το Health Connect από μόνο του· η εφαρμογή σας Android το κάνει. Η δική της εφαρμογή του Anpheros, **Anpheros Daily**, διαβάζει το Health Connect σε Android (προγράμματα Plus και Max) και γράφει ημερήσιες περιλήψεις στο αρχείο.

## Συχνές ερωτήσεις

### Διαθέτει το Health Connect API cloud;
Όχι. Το Health Connect αποθηκεύει δεδομένα στο τηλέφωνο, και μόνο εφαρμογές σε αυτό το τηλέφωνο μπορούν να τα διαβάσουν, με την άδεια του χρήστη. Για να μεταφέρετε τα δεδομένα σε έναν διακομιστή, η εφαρμογή σας τα διαβάζει και τα στέλνει.

### Υπάρχει Health Connect REST API ή web API;
Όχι. Το Health Connect είναι ένα API για συσκευές Android χωρίς τελικό σημείο REST ή web. Ένας διακομιστής λαμβάνει τα δεδομένα μόνο όταν μια εφαρμογή στο τηλέφωνο τα διαβάζει και τα στέλνει, για παράδειγμα ως FHIR Observations στο Anpheros.

### Μπορώ να χρησιμοποιήσω το Health Connect API από Python ή React Native;
Όχι από Python, επειδή εκτελείται στο τηλέφωνο, όχι σε διακομιστή. Από React Native ή Flutter, ναι, μέσω κοινοτικών ή επίσημων plugins που καλούν το Android API εντός της εφαρμογής.

### Γιατί η εφαρμογή μου μπορεί να διαβάσει μόνο 30 ημέρες δεδομένων Health Connect;
Χωρίς την άδεια `READ_HEALTH_DATA_HISTORY`, το Health Connect περιορίζει τις αναγνώσεις σε 30 ημέρες πριν από τη χορήγηση της πρώτης άδειας. Ζητήστε την άδεια ιστορικού εάν χρειάζεστε παλαιότερα δεδομένα.

### Συγχρονίζεται το Garmin με το Health Connect;
Ναι. Η Google ανακοίνωσε τον Αύγουστο του 2025 ότι το Garmin Connect υποστηρίζει το Health Connect σε Android 14 και νεότερες εκδόσεις, για δεδομένα δραστηριότητας και ευεξίας, όπως καρδιακός ρυθμός και θερμίδες. Οι δικές του μετρήσεις της Garmin, όπως το Body Battery, δεν κοινοποιούνται.

### Μπορώ να διαβάσω δεδομένα Fitbit χωρίς το Fitbit Web API;
Στο Android, ναι: μόλις ο χρήστης ενεργοποιήσει το Health Connect στην εφαρμογή Fitbit, τα δεδομένα Fitbit είναι διαθέσιμα στο Health Connect για εφαρμογές που εξουσιοδοτεί.

### Γιατί η καταμέτρηση βημάτων του Health Connect διαφέρει από την εφαρμογή του κατασκευαστή μου;
Η εφαρμογή του κατασκευαστή ενδέχεται να μην έχει εξαγάγει τα τελευταία της δεδομένα ακόμη, να εξάγει μόνο ορισμένους τύπους, ή το Health Connect ενδέχεται να προτιμά μια άλλη πηγή για την ίδια περίοδο. Ελέγξτε τις πηγές δεδομένων και την προτεραιότητά τους στις ρυθμίσεις του Health Connect.

## Σχετικά

- [Αναστολή λειτουργίας του Fitbit Web API (Οκτώβριος 2026)](https://developers.anpheros.com/el/guides/fitbit-web-api-shutdown)
- [Δεδομένα φορητών συσκευών σε FHIR](https://developers.anpheros.com/el/guides/wearable-data-fhir): ο πίνακας αντιστοίχισης και ο κώδικας backend
- [Samsung Health σε FHIR](https://developers.anpheros.com/el/guides/samsung-health-fhir)
- [Apple Health (HealthKit) σε FHIR](https://developers.anpheros.com/el/guides/apple-health-fhir)
- [Πώς να δημιουργήσετε μια εφαρμογή υγειονομικής περίθαλψης με Flutter](https://developers.anpheros.com/el/guides/healthcare-app-flutter)
