המדריך הזה תואם לגרסה 1.1.0-beta02 של Health Connect.
כדי לכתוב נתונים רפואיים באמצעות 'רשומות בריאות אישיות' (PHR) ב-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 מייצג מקור נתונים שגלוי למשתמשים, כמו ארגון בריאות, בית חולים או ממשק API.
התיק הרפואי שמאוחסן ב-Health Connect מאורגן ב-MedicalDataSource
. כך אפשר להפריד בין רשומות רפואיות של אותו אדם שמגיעות ממקורות שונים, כמו ממשקי API או מערכות בריאות.
אם כל הרשומות מגיעות מאותו מקור, אפליקציית כתיבה צריכה ליצור רק MedicalDataSource
אחד. אם הרשומות מגיעות ממקורות מרובים, אפליקציה עדיין יכולה ליצור MedicalDataSource
יחיד אם הנתונים האלה מתואמים וכל הרשומות מכילות שילוב ייחודי של סוג משאב FHIR ומזהה משאב FHIR.
אחרת, צריך ליצור MedicalDataSource
לכל מקור נתונים.
כל הרשומות הרפואיות חייבות להיות משויכות ל-MedicalDataSource
, לכן צריך ליצור אותו לפני שמזינים את המשאבים.
המאפיינים של MedicalDataSource
:
- שם לתצוגה (חובה) – השם המוצג של מקור הנתונים שמוצג למשתמשים, עם מזהה ייחודי לכל אפליקציית כתיבה.
FHIR Base URI (חובה) – לנתונים שמגיעים משרת FHIR, זה צריך להיות כתובת ה-URL הבסיסית של FHIR (לדוגמה,
https://example.com/fhir/
). אפשר לשייך כמה מקורות נתונים לאותה כתובת URL בסיסית של FHIR.אם הנתונים נוצרים על ידי אפליקציה ללא כתובת URL של FHIR, זה צריך להיות URI ייחודי וברור שהאפליקציה מגדירה (לדוגמה,
myapp://..
) ומצביע על מקור הנתונים.לדוגמה, אם אפליקציית לקוח תומכת בקישור עומק, אפשר להשתמש בקישור העומק הזה כ-URI הבסיסי של FHIR. האורך המקסימלי של ה-URI הוא 2,000 תווים.
שם החבילה (מאוכלס באופן אוטומטי) – האפליקציה שכותבת את הנתונים.
גרסת 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
ב-PHR:
{
"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)
)
)