Leggere i dati medici

Questa guida è compatibile con la versione 1.1.0-beta02 di Connessione Salute.

Per leggere i dati medici utilizzando le cartelle cliniche in Connessione Salute:

  1. Verifica la disponibilità delle funzionalità.
  2. Richiedi le autorizzazioni di lettura.
  3. Leggere le cartelle cliniche (MedicalResource).
  4. Leggi le origini dati (MedicalDataSource).

Disponibilità della funzionalità

Per determinare se il dispositivo di un utente supporta le cartelle cliniche su Health Connect, controlla la disponibilità di FEATURE_PERSONAL_HEALTH_RECORD sul client:

if (healthConnectClient
     .features
     .getFeatureStatus(
       HealthConnectFeatures.FEATURE_PERSONAL_HEALTH_RECORD
     ) == HealthConnectFeatures.FEATURE_STATUS_AVAILABLE) {

  // Feature is available
} else {
  // Feature isn't available
}

Per saperne di più, consulta la sezione Verificare la disponibilità delle funzionalità.

Autorizzazioni richieste

La lettura dei dati medici è protetta dalla seguente autorizzazione:

  • 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

Dichiara queste autorizzazioni in Play Console per la tua app, nonché nel manifest dell'app:

<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>

Sei responsabile della dichiarazione di tutte le autorizzazioni appropriate che intendi utilizzare nei tuoi dispositivi e nelle tue app. Prima dell'utilizzo, devi anche verificare che ogni autorizzazione sia stata concessa dall'utente.

Richiedere le autorizzazioni all'utente

Dopo aver creato un'istanza client, l'app deve richiedere le autorizzazioni all'utente. Gli utenti devono poter concedere o negare le autorizzazioni in qualsiasi momento.

A questo scopo, crea un insieme di autorizzazioni per i tipi di dati richiesti. Assicurati che le autorizzazioni nel set siano dichiarate prima nel file manifest di 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
)

Utilizza getGrantedPermissions per verificare se la tua app dispone già delle autorizzazioni richieste. In caso contrario, utilizza createRequestPermissionResultContract per richiedere queste autorizzazioni. Viene visualizzata la schermata delle autorizzazioni di Connessione Salute.

// 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)
  }
}

Poiché gli utenti possono concedere o revocare le autorizzazioni in qualsiasi momento, la tua app deve controllare periodicamente le autorizzazioni concesse e gestire gli scenari in cui l'autorizzazione viene persa.

Risorse mediche

Puoi leggere qualsiasi risorsa medica (MedicalResource) scritta in Connessione Salute per l'utente, incluse quelle aggiunte da altre app.

Recuperare i record MedicalResource

Filtra una richiesta GET specificando medicalResourceType. Assicurati di utilizzare richieste paginate e tieni presente il limite di frequenza.

// 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.
// All `MedicalResource`s in the given `MedicalDataSource`s and of given `medicalResourceType`
// will be retrieved.
val initialRequest: ReadMedicalResourcesRequest =
    ReadMedicalResourcesInitialRequest(
        MEDICAL_RESOURCE_TYPE_LABORATORY_RESULTS,
        setOf(medicalDataSource.id),
        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)

Ottieni record MedicalResource per ID

Puoi anche recuperare un MedicalResource utilizzando un ID:

// 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
            )
        }
    )

Origini dati

Puoi leggere qualsiasi origine dati (MedicalDataSource) scritta in Connessione Salute per l'utente, inclusi quelli aggiunti da altre app.

Recuperare un record MedicalDataSource in base al nome del pacchetto

Utilizza GetMedicalDataSourcesRequest per richiedere in base al nome del pacchetto (app):

// 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))
    )

Ottieni un record MedicalDataSource per ID

In alternativa, richiedi per id se lo conosci:

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