برای نوشتن دادههای پزشکی با استفاده از Medical Records در Health Connect، مراحل زیر را دنبال کنید:
- بررسی در دسترس بودن ویژگیها
- درخواست مجوزهای نوشتن
- ایجاد یک منبع داده (
MedicalDataSource
) - یک منبع پزشکی بنویسید (
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>
شما مسئول اعلام تمام مجوزهای مناسبی هستید که قصد دارید در دستگاهها و برنامههای خود استفاده کنید. همچنین باید قبل از استفاده، بررسی کنید که هر مجوز توسط کاربر اعطا شده باشد.
درخواست مجوز از کاربر
پس از ایجاد یک نمونه کلاینت، برنامه شما باید از کاربر درخواست مجوز کند. کاربران باید بتوانند در هر زمانی مجوزها را اعطا یا رد کنند.
برای انجام این کار، مجموعهای از مجوزها را برای انواع دادههای مورد نیاز ایجاد کنید. مطمئن شوید که مجوزهای موجود در مجموعه ابتدا در مانیفست اندروید شما تعریف شدهاند.
// 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 نشان دهنده یک منبع داده کاربرپسند مانند یک سازمان مراقبتهای بهداشتی، یک بیمارستان یا یک API است.
سوابق پزشکی ذخیره شده در Health Connect در یک MedicalDataSource
سازماندهی میشوند. این امر امکان جداسازی سوابق پزشکی مربوط به یک فرد را که از منابع مختلفی مانند APIها یا سیستمهای مراقبتهای بهداشتی تهیه شدهاند، فراهم میکند.
هنگام ایجاد رکوردهای MedicalDataSource
موارد زیر را در نظر بگیرید:
- اگر همه رکوردها از یک منبع سرچشمه میگیرند، یک
MedicalDataSource
ایجاد کنید. - اگر رکوردها از چندین منبع سرچشمه میگیرند، میتوانید یک
MedicalDataSource
واحد ایجاد کنید اگر:- دادهها تطبیق داده میشوند.
- همه رکوردها ترکیبی منحصر به فرد از نوع منبع FHIR و شناسه منبع FHIR دارند. در یک
MedicalDataSource
، فقط یک رکورد از نوع منبع FHIR با هر شناسه منبع FHIR میتواند وجود داشته باشد.
- در غیر این صورت، برای جلوگیری از شناسههای تکراری، برای هر منبع داده یک
MedicalDataSource
ایجاد کنید.
تمام سوابق پزشکی باید با یک MedicalDataSource
مرتبط باشند، بنابراین این باید قبل از نوشتن منابع ایجاد شود.
ویژگیهای MedicalDataSource
:
- نام نمایشی (الزامی) - نام نمایشی منبع داده که در مقابل کاربر قرار میگیرد و به طور منحصر به فرد برای هر برنامهی نوشتاری شناسایی میشود.
آدرس اینترنتی پایه FHIR (الزامی) - برای دادههایی که از یک سرور FHIR میآیند، این باید آدرس اینترنتی پایه FHIR باشد (برای مثال،
https://example.com/fhir/
). چندین منبع داده میتوانند با همان آدرس اینترنتی پایه FHIR مرتبط شوند.اگر دادهها توسط برنامهای بدون URL 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 را در متغیر مخصوص به خود برای درج به عنوان یک منبع پزشکی ذخیره کنید.
اگر در مورد فرمت JSON مربوط به FHIR به کمک نیاز دارید، به دادههای نمونه ارائه شده توسط سازمان 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)
)
)