يتوافق هذا الدليل مع الإصدار 1.1.0-beta02 من Health Connect.
لكتابة البيانات الطبية باستخدام "السجلّات الصحية الشخصية" في 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 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
:
- الاسم المعروض (مطلوب): الاسم المعروض الموجَّه للمستخدم لمصدر البيانات، وهو يتم تحديده بشكل فريد لكل تطبيق كتابة.
معرّف الموارد المتسلسل الأساسي لتنسيق FHIR (مطلوب): بالنسبة إلى البيانات الواردة من خادم FHIR، يجب أن يكون عنوان URL الأساسي لتنسيق FHIR (على سبيل المثال،
https://example.com/fhir/
). يمكن ربط مصادر بيانات متعدّدة بعنوان URL الأساسي نفسه لتنسيق FHIR.إذا تم إنشاء البيانات بواسطة تطبيق بدون عنوان URL لـ FHIR، يجب أن يكون معرّف الموارد المنتظم (URI) فريدًا ومفهومًا يحدّده التطبيق (على سبيل المثال،
myapp://..
) ويشير إلى مصدر البيانات.على سبيل المثال، إذا كان تطبيق العميل يتيح الروابط لصفحات في التطبيق، يمكن استخدام هذا الرابط لصفحة في التطبيق كمعرّف الموارد المنتظم الأساسي لـ FHIR. الحد الأقصى لطول عنوان URI هو 2000 حرف.
اسم الحزمة (يتم تعبئته تلقائيًا): التطبيق الذي يكتب البيانات
إصدار 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
يمثّل
سلسلة 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)
)
)