كتابة البيانات الطبية

يتوافق هذا الدليل مع الإصدار 1.1.0-beta02 من Health Connect.

لكتابة البيانات الطبية باستخدام "السجلّات الصحية الشخصية" في Health Connect، اتّبِع الخطوات التالية:

  1. التحقّق من توفّر الميزات
  2. طلب أذونات الكتابة
  3. إنشاء مصدر بيانات (MedicalDataSource)
  4. كتابة مرجع طبي (MedicalResource)

مدى توفّر الميزة

لتحديد ما إذا كان جهاز المستخدم متوافقًا مع "ملف المرضى الإلكتروني" على Health Connect، تحقَّق من توفّر FEATURE_PERSONAL_HEALTH_RECORD على العميل:

if (healthConnectClient
     .features
     .getFeatureStatus(
       HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD
     ) == HealthConnectFeatures.FEATURE_STATUS_AVAILABLE) {

  // Feature is available
} else {
  // Feature isn't available
}

اطّلِع على التحقّق من مدى توفّر الميزة لمعرفة المزيد من المعلومات.

الأذونات المطلوبة

تتم حماية كتابة البيانات الطبية من خلال الإذن التالي:

  • android.permission.health.WRITE_MEDICAL_DATA

يجب الإفصاح عن هذه الأذونات في Play Console لتطبيقك، وكذلك في ملف بيان تطبيقك:

<application>
  <uses-permission
android:name="android.permission.health.WRITE_MEDICAL_DATA" />
</application>

أنت مسؤول عن الإفصاح عن جميع الأذونات المناسبة التي تريد استخدامها في أجهزتك وتطبيقاتك. يجب أيضًا التحقّق من أنّه قد منح كل إذن قبل استخدامه.

طلب الأذونات من المستخدم

بعد إنشاء مثيل عميل، يجب أن يطلب تطبيقك الأذونات من العميل. يجب السماح للمستخدمين بمنح الأذونات أو رفضها في أي وقت.

لإجراء ذلك، أنشئ مجموعة من الأذونات لأنواع البيانات المطلوبة. تأكَّد من أنّ الأذونات في المجموعة مُدرَجة في بيان Android أولاً.

// Create a set of permissions for required data types
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_WRITE_MEDICAL_DATA

val PERMISSIONS =
    setOf(
       PERMISSION_WRITE_MEDICAL_DATA
)

استخدِم getGrantedPermissions لمعرفة ما إذا كان تطبيقك قد حصل على الأذونات المطلوبة. وإذا لم يكن الأمر كذلك، استخدِم createRequestPermissionResultContract لطلب هذه الأذونات. يؤدي ذلك إلى عرض شاشة أذونات Health Connect.

// Create the permissions launcher
val requestPermissionActivityContract = PermissionController.createRequestPermissionResultContract()

val requestPermissions = registerForActivityResult(requestPermissionActivityContract) { granted ->
  if (granted.containsAll(PERMISSIONS)) {
    // Permissions successfully granted
  } else {
    // Lack of required permissions
  }
}

suspend fun checkPermissionsAndRun(healthConnectClient: HealthConnectClient) {
  val granted = healthConnectClient.permissionController.getGrantedPermissions()
  if (granted.containsAll(PERMISSIONS)) {
    // Permissions already granted; proceed with inserting or reading data
  } else {
    requestPermissions.launch(PERMISSIONS)
  }
}

بما أنّه يمكن للمستخدمين منح الأذونات أو إبطالها في أي وقت، يجب أن يتحقق تطبيقك بشكلٍ دوري من الأذونات الممنوحة ويتعامل مع السيناريوهات التي يتم فيها فقدان الإذن.

مصادر البيانات

يمثّل الرمز MedicalDataSource في Health Connect مصدر بيانات موجّهًا للمستخدم، مثل مؤسسة رعاية صحية أو مستشفى أو واجهة برمجة تطبيقات.

يتم تنظيم السجلّات الطبية المخزّنة في Health Connect في MedicalDataSource. ويسمح ذلك بفصل السجلات الطبية الخاصة بالمريض نفسه والتي تأتي من مصادر مختلفة، مثل واجهات برمجة التطبيقات أو أنظمة الرعاية الصحية.

إذا كانت جميع السجلّات مصدرها هو نفسه، ما على تطبيق الكتابة سوى إنشاء MedicalDataSource واحد فقط. إذا كانت السجلات مصدرها مصادر متعددة، يمكن للتطبيق إنشاء MedicalDataSource واحد إذا تمت مراجعة هذه البيانات وكانت كل السجّلات تتضمّن مجموعة فريدة من نوع مورد FHIR ورقم تعريفه. بخلاف ذلك، يجب إنشاء MedicalDataSource لكلّ مصدر بيانات.

يجب أن تكون جميع السجلات الطبية مرتبطة بـ MedicalDataSource، لذا يجب إنشاء هذا العنصر قبل كتابة الموارد.

خصائص MedicalDataSource:

أنشئ سجلّ MedicalDataSource.

أنشئ سجلّاً لكل مؤسسة أو كيان رعاية صحية مرتبط بتطبيقك.

// Create a `MedicalDataSource`
// Note that `displayName` must be unique across `MedicalDataSource`s
// Each `MedicalDataSource` is assigned an `id` by the system on creation
val medicalDataSource: MedicalDataSource =
    healthConnectClient.createMedicalDataSource(
        CreateMedicalDataSourceRequest(
            fhirBaseUri = Uri.parse("https://fhir.com/oauth/api/FHIR/R4/"),
            displayName = "Test Data Source",
            fhirVersion = FhirVersion(4, 0, 1)
        )
    )

حذف سجلّ MedicalDataSource

يعرض المثال السابق id من قِبل النظام عند الإنشاء. إذا كنت بحاجة إلى حذف سجلّ MedicalDataSource، يمكنك الإشارة إلى id نفسه:

// Delete the `MedicalDataSource` that has the specified `id`
healthConnectClient.deleteMedicalDataSourceWithData(medicalDataSource.id)

المراجع الطبية

يمثّل MedicalResource في Health Connect مورد FHIR (الذي يحتوي على سجلّ طبي)، بالإضافة إلى البيانات الوصفية.

خصائص MedicalResource:

  • DataSourceId (مطلوبة) - مصدر البيانات كما هو موضّح في MedicalDataSource.
  • إصدار FHIR (مطلوب) - إصدار FHIR يجب أن يكون إصدارًا متوافقًا.
  • مورد FHIR (مطلوب) هو مثيل مورد FHIR بترميز JSON.
  • نوع المرجع الطبي (يتم تعبئته تلقائيًا): الفئة الموجَّهة للمستخدمين للمرجع، والتي ترتبط بالتصاريح الموجَّهة للمستخدمين

تحضير موارد FHIR بتنسيق JSON

قبل كتابة الموارد الطبية في Health Connect، عليك إعداد سجلّات موارد FHIR بتنسيق JSON. تخزين كل ملف JSON في متغيّر خاص به لإدراجه كمرجع طبي

إذا كنت بحاجة إلى مساعدة بشأن تنسيق FHIR JSON، يمكنك الرجوع إلى أمثلة البيانات التي تقدّمها مؤسّسة HL7.

إدراج سجلّات MedicalResource أو تعديلها

استخدِم UpsertMedicalResourceRequest لإدراج سجلّات MedicalResource جديدة أو تعديل السجلات الحالية لMedicalDataSource:

// Insert `MedicalResource`s into the `MedicalDataSource`
val medicalResources: List<MedicalResource> =
    healthConnectClient.upsertMedicalResources(
        listOf(
            UpsertMedicalResourceRequest(
                medicalDataSource.id,
                medicalDataSource.fhirVersion,
                medicationJsonToInsert // a valid FHIR json string
            )
        )
    )

// Update `MedicalResource`s in the `MedicalDataSource`
val updatedMedicalResources: List<MedicalResource> =
    healthConnectClient.upsertMedicalResources(
        listOf(
            UpsertMedicalResourceRequest(
                medicalDataSource.id,
                medicalDataSource.fhirVersion,
                // a valid FHIR json string
                // if this resource has the same type and ID as in `medicationJsonToInsert`,
                // this `upsertMedicalResources()` call will update the previously inserted
                // `MedicalResource`
                updatedMedicationJsonToInsert
            )
        )
    )

مثال لمورد FHIR

في المثال السابق، كان المتغيّر medicationJsonToInsert يمثّل سلسلة FHIR JSON صالحة.

في ما يلي مثال على الشكل الذي قد يبدو عليه ملف JSON، باستخدام AllergyIntolerance كنوع مورد FHIR، والذي سيتم ربطه بنوع المورد الطبي FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE في سجلّ المرضى الإلكتروني:

{
  "resourceType": "AllergyIntolerance",
  "id": "allergyintolerance-1",
  "criticality": "high",
  "code": {
    "coding": [
      {
        "system": "http://snomed.info/sct",
        "code": "91936005",
        "display": "Penicillin allergy"
      }
    ],
    "text": "Penicillin allergy"
  },
  "recordedDate": "2020-10-09T14:58:00+00:00",
   "asserter": {
    "reference": "Patient/patient-1"
  },
  "lastOccurrence": "2020-10-09",
  "patient": {
    "reference": "Patient/patient-1",
    "display": "B., Alex"
  }
  ...
}

حذف سجلّ MedicalResource

قد يتم حذف MedicalResource سجلًّا حسب رقم التعريف:

// Delete `MedicalResource`s matching the specified `dataSourceId`, `type` and `fhirResourceId`
healthConnectClient.deleteMedicalResources(
    medicalResources.map { medicalResource: MedicalResource ->
        MedicalResourceId(
            dataSourceId = medicalDataSource.id,
            fhirResourceType = medicalResource.id.fhirResourceType,
            fhirResourceId = medicalResource.id.fhirResourceId
        )
    }
)

أو يمكن لـ medicalResourceType حذفها باتّباع الخطوات التالية:

// Delete all `MedicalResource`s that are in any pair of provided `dataSourceIds` and
// `medicalResourceTypes`
healthConnectClient.deleteMedicalResources(
    DeleteMedicalResourcesRequest(
        dataSourceIds = setOf(medicalDataSource.id),
        medicalResourceTypes = setOf(MEDICAL_RESOURCE_TYPE_MEDICATIONS)
    )
)