نوشتن داده‌های پزشکی

این راهنما با Health Connect نسخه 1.1.0-beta02 یا بالاتر سازگار است.

برای نوشتن داده‌های پزشکی بااستفاده از «سوابق پزشکی» در 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» برای برنامه‌تان و همچنین در مانیفست برنامه‌تان اعلام کنید:

<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 ایجاد کنید.
  • اگر سوابق از چندین منبع منشأ گرفته باشند، می‌توانید یک MedicalDataSource ایجاد کنید اگر:
    • داده‌ها تطبیق داده شده‌اند.
    • همه سوابق ترکیب منحصربه‌فردی از نوع منبع FHIR و شناسه منبع FHIR دارند. در MedicalDataSource، فقط یک سابقه از نوع منبع FHIR با هر شناسه منبع FHIR می‌تواند وجود داشته باشد.
  • درغیراین‌صورت، برای جلوگیری از شناسه‌های تکراری، برای هر منبع داده یک MedicalDataSource ایجاد کنید.

همه سوابق پزشکی باید با MedicalDataSource مرتبط باشند، بنابراین این مورد باید قبل‌از نوشتن منابع ایجاد شود.

مشخصات MedicalDataSource:

  • نام نمایشی (الزامی) - نام نمایشی سَمت کاربر برای منبع داده، که به‌طور منحصربه‌فرد برای هر برنامه نوشتن شناسایی می‌شود.
  • شناسه منبع یکسان پایه FHIR (الزامی) - برای داده‌هایی که از سرور FHIR می‌آیند، این باید نشانی وب پایه FHIR باشد (برای مثال، https://example.com/fhir/). چندین منبع داده را می‌توان با یک نشانی وب پایه FHIR مرتبط کرد.

    اگر داده‌ها توسط برنامه‌ای بدون نشانی وب FHIR تولید شده باشد، این باید یک URI یکتا و قابل‌فهم باشد که توسط برنامه تعریف شده است (برای مثال، myapp://..) و به منبع داده‌ها اشاره می‌کند.

    به‌عنوان مثال، اگر برنامه کارخواه از پیوند عمیق پشتیبانی کند، این پیوند عمیق می‌تواند به‌عنوان URI پایه FHIR استفاده شود. حداکثر طول URI‏ ۲۰۰۰ نویسه است.

  • نام بسته (به‌طور خودکار درج می‌شود) - برنامه‌ای که داده‌ها را می‌نویسد.

  • نسخه FHIR (الزامی) - نسخه FHIR. باید نسخه پشتیبانی‌شده باشد.

ایجاد سابقه 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 نشان‌دهنده رشته JSON معتبر FHIR بود.

در اینجا نمونه‌ای از آنچه که 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)
    )
)