# Health Connect إلى FHIR

> اقرأ بيانات Android Health Connect من Fitbit و Garmin و Oura و Withings و Wear OS في Flutter واكتبها إلى سجل FHIR R4: الأذونات، السجل، مراجعة Play.

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

**Health Connect هو مخزن بيانات الصحة على الجهاز في Android: تطبيقات Samsung Health و Fitbit و Garmin Connect و Oura و Withings و Wear OS تكتب فيه، ويقرأ تطبيقك منه بإذن الشخص.** لوضع هذه البيانات في سجل FHIR، اقرأ الإجماليات والمتوسطات اليومية على الهاتف، وأرسلها إلى الواجهة الخلفية الخاصة بك، واكتب كل مقياس كملاحظة (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 ([مدونة 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/ar/guides/samsung-health-fhir) |

يجب أن يكون لدى كل تطبيق بائع إذن **للكتابة** إلى Health Connect، والذي يمنحه الشخص في هذا التطبيق أو في إعدادات Health Connect. إذا كان مصدر مفقودًا، فهذا هو أول شيء يجب التحقق منه.

## الأذونات التي يتطلبها Android

- إذن واحد لكل نوع سجل واتجاه، على سبيل المثال `android.permission.health.READ_HEART_RATE` و `android.permission.health.READ_STEPS`، يتم الإعلان عنه في البيان ويُطلب وقت التشغيل.
- **السجل (History):** بدون `android.permission.health.READ_HEALTH_DATA_HISTORY`، يمكن للتطبيق قراءة آخر 30 يومًا فقط قبل منح الإذن.
- **الخلفية (Background):** القراءة بينما التطبيق ليس في المقدمة تتطلب `android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND`.
- شاشة **شرح الأذونات (permissions rationale)** (نشاط يعالج `ACTION_SHOW_PERMISSIONS_RATIONALE`، بالإضافة إلى اسم مستعار للنشاط على Android 14) تشرح سياسة الخصوصية الخاصة بك؛ بدونها، لن يتم فتح مربع حوار الإذن.
- في Flutter، يجب أن يمتد `MainActivity` من `FlutterFragmentActivity`، وليس `FlutterActivity`، وإلا ستفشل طلبات الأذونات.

## قراءة القيم اليومية في Flutter

حزمة [`health`](https://pub.dev/packages/health) تقرأ Health Connect على Android و Apple Health على iOS خلف واجهة برمجة تطبيقات واحدة. يستخدم المثال الإصدار 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

أرسل القيم إلى الواجهة الخلفية الخاصة بك واكتب ملاحظة (Observation) واحدة لكل شخص ومقياس ويوم بمعرف ثابت، وقم بتحديثها عند إرسال نفس اليوم مرة أخرى. جدول التعيين الكامل (سجل Health Connect → LOINC → UCUM)، ومثال FHIR صالح، وتشغيل عملية التحديث (upsert) باستخدام TypeScript ضد المنصة موجودة في [بيانات الأجهزة القابلة للارتداء في FHIR](https://developers.anpheros.com/ar/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 واجهة برمجة تطبيقات سحابية؟
لا. يقوم Health Connect بتخزين البيانات على الهاتف، ولا يمكن للتطبيقات الموجودة على هذا الهاتف فقط قراءتها، بإذن الشخص. للحصول على البيانات إلى خادم، يقرأها تطبيقك ويرسلها.

### هل توجد واجهة برمجة تطبيقات REST أو واجهة برمجة تطبيقات ويب لـ Health Connect؟
لا. Health Connect هي واجهة برمجة تطبيقات Android على الجهاز بدون نقطة نهاية REST أو ويب. يستقبل الخادم البيانات فقط عندما يقرأها تطبيق على الهاتف ويرسلها، على سبيل المثال كـ FHIR Observations إلى Anpheros.

### هل يمكنني استخدام واجهة برمجة تطبيقات Health Connect من Python أو React Native؟
ليس من Python، لأنه يعمل على الهاتف، وليس على خادم. من React Native أو Flutter، نعم، من خلال إضافات مجتمعية أو رسمية تستدعي واجهة برمجة تطبيقات Android داخل التطبيق.

### لماذا يمكن لتطبيقي قراءة بيانات Health Connect لمدة 30 يومًا فقط؟
بدون إذن `READ_HEALTH_DATA_HISTORY`، يحد Health Connect القراءات إلى 30 يومًا قبل منح الإذن الأول. اطلب إذن السجل إذا كنت بحاجة إلى بيانات أقدم.

### هل يتزامن Garmin مع Health Connect؟
نعم. أعلنت Google في أغسطس 2025 أن Garmin Connect يدعم Health Connect على Android 14 والإصدارات الأحدث، لبيانات النشاط والعافية مثل معدل ضربات القلب والسعرات الحرارية. لا تتم مشاركة درجات Garmin الخاصة، مثل Body Battery.

### هل يمكنني قراءة بيانات Fitbit بدون واجهة برمجة تطبيقات الويب لـ Fitbit؟
على Android، نعم: بمجرد أن يمكّن الشخص Health Connect في تطبيق Fitbit، تصبح بيانات Fitbit متاحة في Health Connect للتطبيقات التي يصرحون بها.

### لماذا يختلف عدد خطوات Health Connect عن تطبيق البائع الخاص بي؟
قد لا يكون تطبيق البائع قد قام بتصدير أحدث بياناته بعد، وقد يقوم بتصدير أنواع معينة فقط، أو قد يفضل Health Connect مصدرًا آخر لنفس الفترة. تحقق من مصادر البيانات وأولويتها في إعدادات Health Connect.

## ذات الصلة

- [إيقاف Fitbit Web API (أكتوبر 2026)](https://developers.anpheros.com/ar/guides/fitbit-web-api-shutdown)
- [بيانات الأجهزة القابلة للارتداء في FHIR](https://developers.anpheros.com/ar/guides/wearable-data-fhir): جدول التعيين والرمز الخلفي
- [Samsung Health إلى FHIR](https://developers.anpheros.com/ar/guides/samsung-health-fhir)
- [Apple Health (HealthKit) إلى FHIR](https://developers.anpheros.com/ar/guides/apple-health-fhir)
- [كيفية بناء تطبيق رعاية صحية باستخدام Flutter](https://developers.anpheros.com/guides/healthcare-app-flutter)
