קריאת נתונים רפואיים

המדריך הזה תואם לגרסה 1.1.0-beta02 של Health Connect ואילך.

כדי לקרוא נתונים רפואיים באמצעות "תיק רפואי" ב-Health Connect:

  1. בודקים אם התכונה זמינה.
  2. מבקשים הרשאות קריאה.
  3. לקרוא נתונים, כמו רשומות של MedicalResource או פרטים של MedicalDataSource.

זמינות התכונה

כדי לדעת אם המכשיר של המשתמש מאפשר להשתמש בתיקים רפואיים ב-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.READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES
  • android.permission.health.READ_MEDICAL_DATA_CONDITIONS
  • android.permission.health.READ_MEDICAL_DATA_LABORATORY_RESULTS
  • android.permission.health.READ_MEDICAL_DATA_MEDICATIONS
  • android.permission.health.READ_MEDICAL_DATA_PERSONAL_DETAILS
  • android.permission.health.READ_MEDICAL_DATA_PRACTITIONER_DETAILS
  • android.permission.health.READ_MEDICAL_DATA_PREGNANCY
  • android.permission.health.READ_MEDICAL_DATA_PROCEDURES
  • android.permission.health.READ_MEDICAL_DATA_SOCIAL_HISTORY
  • android.permission.health.READ_MEDICAL_DATA_VACCINES
  • android.permission.health.READ_MEDICAL_DATA_VISITS
  • android.permission.health.READ_MEDICAL_DATA_VITAL_SIGNS

צריך להצהיר על ההרשאות האלה ב-Play Console עבור האפליקציה, וגם בקובץ המניפסט של האפליקציה:

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

אתם אחראים להצהיר על כל ההרשאות המתאימות שאתם מתכוונים להשתמש בהן במכשירים ובאפליקציות שלכם. לפני השימוש, חשוב גם לוודא שהמשתמש נתן כל אחת מההרשאות.

בקשת הרשאות מהמשתמש

אחרי שיוצרים מופע של לקוח, האפליקציה צריכה לבקש הרשאות מהמשתמש. המשתמשים חייבים להיות מסוגלים להעניק או לדחות הרשאות בכל שלב.

כדי לעשות זאת, יוצרים קבוצת הרשאות לסוגי הנתונים הנדרשים. קודם צריך לוודא שההרשאות בקבוצה מוצהרות במניפסט של Android.

// Create a set of permissions for required data types
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_CONDITIONS
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_LABORATORY_RESULTS
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_MEDICATIONS
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_PERSONAL_DETAILS
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_PRACTITIONER_DETAILS
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_PREGNANCY
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_PROCEDURES
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_SOCIAL_HISTORY
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_VACCINES
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_VISITS
import androidx.health.connect.client.permission.HealthPermission.Companion.PERMISSION_READ_MEDICAL_DATA_VITAL_SIGNS

val PERMISSIONS =
    setOf(
        PERMISSION_READ_MEDICAL_DATA_ALLERGIES_INTOLERANCES
        PERMISSION_READ_MEDICAL_DATA_CONDITIONS
        PERMISSION_READ_MEDICAL_DATA_LABORATORY_RESULTS
        PERMISSION_READ_MEDICAL_DATA_MEDICATIONS
        PERMISSION_READ_MEDICAL_DATA_PERSONAL_DETAILS
        PERMISSION_READ_MEDICAL_DATA_PRACTITIONER_DETAILS
        PERMISSION_READ_MEDICAL_DATA_PREGNANCY
        PERMISSION_READ_MEDICAL_DATA_PROCEDURES
        PERMISSION_READ_MEDICAL_DATA_SOCIAL_HISTORY
        PERMISSION_READ_MEDICAL_DATA_VACCINES
        PERMISSION_READ_MEDICAL_DATA_VISITS
        PERMISSION_READ_MEDICAL_DATA_VITAL_SIGNS
)

אפשר להשתמש ב-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)
  }
}

המשתמשים יכולים לתת או לבטל הרשאות בכל שלב, ולכן האפליקציה צריכה לבדוק אם ההרשאות ניתנו בכל פעם לפני שהיא משתמשת בהן, ולטפל במקרים שבהם הרשאה כלשהי בוטלה.

משאבים רפואיים

אתם יכולים לקרוא כל משאב רפואי (MedicalResource) שנכתב ב-Health Connect עבור המשתמש, כולל משאבים שנוספו על ידי אפליקציות אחרות.

קבלת רשומות של MedicalResource

כדי לסנן בקשת GET, מציינים את medicalResourceType. חשוב להשתמש בבקשות עם דפים ולשים לב להגבלת קצב של יצירת בקשות.

// Read `MedicalResource`s back from the `MedicalDataSource`
// Read 100 resources / page. See `pageSize` doc for defaults and limits.
val pageSize = 100
// Prepare the initial read request.
// If `medicalDataSourceIds` is empty, all `MedicalResource`s of the given `medicalResourceType`
// across all `MedicalDataSource`s will be retrieved.
val initialRequest: ReadMedicalResourcesRequest =
    ReadMedicalResourcesInitialRequest(
        MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS,
        medicalDataSourceIds = emptySet(),
        pageSize = pageSize,
    )
// Continue reading pages until all `MedicalResource`s are read
var pageToken: String? = null
do {
    // Prepare paged request if needed
    val request: ReadMedicalResourcesRequest =
        if (pageToken == null) initialRequest
        else ReadMedicalResourcesPageRequest(pageToken, pageSize = pageSize)
    // Read `MedicalResource`s
    val response: ReadMedicalResourcesResponse =
        healthConnectClient.readMedicalResources(request)
    // Process `MedicalResource`s
    val resources: List<MedicalResource> = response.medicalResources
    // Advance to next page
    pageToken = response.nextPageToken
} while (pageToken != null)

אחזור רשומות של MedicalResource לפי מזהה

אפשר גם לאחזר MedicalResource באמצעות מזהה:

// Retrieve `fhirResourceType` type `MedicalResource`s with the specified `id`s from the
// provided `MedicalDataSource`
val retrievedMedicalResources: List<MedicalResource> =
    healthConnectClient.readMedicalResources(
        medicalResources.map { medicalResource: MedicalResource ->
            MedicalResourceId(
                dataSourceId = medicalDataSource.id,
                fhirResourceType = medicalResource.id.fhirResourceType,
                fhirResourceId = medicalResource.id.fhirResourceId
            )
        }
    )

מקורות נתונים

אתם יכולים לקרוא כל מקור נתונים (MedicalDataSource) שנכתב ב-Health Connect עבור המשתמש, כולל נתונים שנוספו על ידי אפליקציות אחרות.

‫MedicalDataSource מייצג את המקור של התיקים הרפואיים, כמו בית חולים או מרפאה. כך תוכלו לזהות את המקור של תיקים רפואיים ספציפיים, וזה שימושי לסינון נתונים או להצגת מידע על המקור למשתמש.

קבלת רשומה של MedicalDataSource לפי שם החבילה

משתמשים ב-GetMedicalDataSourcesRequest כדי לשלוח בקשה לפי שם החבילה (אפליקציה):

// Retrieve all `MedicalDataSource`s created by any of the specified package names
// Package names may be found in other `MedicalDataSource`s or from arbitrary input
val medicalDataSources: List<MedicalDataSource> =
    healthConnectClient.getMedicalDataSources(
        GetMedicalDataSourcesRequest(listOf(medicalDataSource.packageName, anotherPackageName))
    )

אחזור רשומה של MedicalDataSource לפי מזהה

או, אם ידוע לך, אפשר לבקש לפי id:

// Retrieve all `MedicalDataSource` with `id` matching any of the given ids
val medicalDataSources: List<MedicalDataSource> =
    healthConnectClient.getMedicalDataSources(listOf(medicalDataSource.id, anotherId))