Questa guida è compatibile con la versione 1.1.0-beta02 di Connessione Salute.
Per scrivere dati medici utilizzando i riepiloghi personali sanitari in Connessione Salute:
- Verificare la disponibilità delle funzionalità
- Richiedi autorizzazioni di scrittura
- Crea un'origine dati (
MedicalDataSource
) - Scrivere una risorsa medica (
MedicalResource
)
Disponibilità della funzionalità
Per determinare se il dispositivo di un utente supporta la PTH 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 Verificare la disponibilità delle funzionalità.
Autorizzazioni richieste
La scrittura di dati medici è protetta dalla seguente autorizzazione:
android.permission.health.WRITE_MEDICAL_DATA
Dichiara queste autorizzazioni in Play Console per la tua app, nonché nel file manifest dell'app:
<application>
<uses-permission
android:name="android.permission.health.WRITE_MEDICAL_DATA" />
</application>
Sei responsabile della dichiarazione di tutte le autorizzazioni appropriate che intendi utilizzare sui tuoi dispositivi e nelle tue app. Prima dell'utilizzo, devi anche verificare che ogni autorizzazione sia stata concessa dall'utente.
Richiedi le autorizzazioni all'utente
Dopo aver creato un'istanza client, l'app deve richiedere all'utente le autorizzazioni. Gli utenti devono poter concedere o negare le autorizzazioni in qualsiasi momento.
A tale scopo, crea un insieme di autorizzazioni per i tipi di dati richiesti. Assicurati innanzitutto che le autorizzazioni nel set siano dichiarate nel file manifest di 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
)
Utilizza getGrantedPermissions
per verificare se alla tua app sono già state concesse le autorizzazioni richieste. In caso contrario, usa
createRequestPermissionResultContract
per richiedere
quelle 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.
Origini dati
Un MedicalDataSource
in Connessione Salute rappresenta un'origine di dati rivolta agli utenti, ad esempio un'organizzazione sanitaria, un ospedale o un'API.
Le cartelle cliniche memorizzate in Connessione Salute sono organizzate in un
MedicalDataSource
. Ciò consente di separare le cartelle cliniche della stessa persona provenienti da fonti diverse, come API o sistemi sanitari.
Se tutti i record provengono dalla stessa origine, un'app di scrittura deve creare solo un MedicalDataSource
. Se i record provengono da più origini, un'app può comunque creare un singolo MedicalDataSource
se i dati vengono riconciliati e tutti i record hanno una combinazione univoca di tipo di risorsa FHIR e ID risorsa FHIR.
In caso contrario, deve essere creato un MedicalDataSource
per ogni origine dati.
Tutti i record medici devono essere associati a un MedicalDataSource
, pertanto questo deve essere creato prima di scrivere le risorse.
Proprietà di MedicalDataSource
:
- Nome visualizzato (obbligatorio): il nome visualizzato per l'utente dell'origine dati, identificato in modo univoco per ogni app di scrittura.
URI di base FHIR (obbligatorio) - Per i dati provenienti da un server FHIR, deve essere l'URL di base FHIR (ad es.
https://example.com/fhir/
). È possibile associare più origini dati allo stesso URL di base FHIR.Se i dati vengono generati da un'app senza un URL FHIR, deve essere un URI univoco e comprensibile definito dall'app (ad es.
myapp://..
) che rimandi all'origine dei dati.Ad esempio, se un'app client supporta i link diretti, questo link diretto potrebbe essere utilizzato come URI base FHIR. La lunghezza massima dell'URI è di 2000 caratteri.
Nome del pacchetto (compilato automaticamente): l'app che scrive i dati.
Versione FHIR (obbligatoria): la versione FHIR. Deve essere una versione supportata.
Crea un record MedicalDataSource
Crea un record per ogni organizzazione sanitaria o entità a cui è collegata la tua app.
// 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)
)
)
Eliminare un record MedicalDataSource
L'esempio precedente restituisce un id
dal sistema al momento della creazione. Se devi eliminare il record MedicalDataSource
, fai riferimento allo stesso MedicalDataSource
:id
// Delete the `MedicalDataSource` that has the specified `id`
healthConnectClient.deleteMedicalDataSourceWithData(medicalDataSource.id)
Risorse mediche
Un MedicalResource
in Connessione Salute rappresenta una risorsa FHIR (che contiene una cartella clinica), insieme ai metadati.
Proprietà di MedicalResource
:
- DataSourceId (obbligatorio) - L'origine dati descritta per un
MedicalDataSource
. - Versione FHIR (obbligatoria): la versione FHIR. Deve essere una versione supportata.
- Risorsa FHIR (obbligatoria) L'istanza della risorsa FHIR con codifica JSON.
- Tipo di risorsa sanitaria (compilato automaticamente): la categoria rivolta agli utenti della risorsa, che corrisponde alle autorizzazioni rivolte agli utenti.
Prepara le risorse FHIR in JSON
Prima di scrivere risorse mediche in Health Connect, prepara i record delle risorse FHIR in JSON. Memorizza ogni JSON nella propria variabile per l'inserimento come risorsa sanitaria.
Se hai bisogno di aiuto per il formato JSON FHIR, consulta i dati di esempio forniti dall'organizzazione HL7.
Inserisci o aggiorna i record MedicalResource
Utilizza UpsertMedicalResourceRequest
per inserire nuovi recordMedicalResource
o aggiornare quelli esistenti per un 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
)
)
)
Risorsa FHIR di esempio
Nell'esempio precedente, la variabile medicationJsonToInsert
rappresentava una
stringa JSON FHIR valida.
Ecco un esempio di come potrebbe essere il JSON, utilizzando AllergyIntolerance come tipo di risorsa FHIR, che verrà mappato al tipo di risorsa medica FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE
nel CRS:
{
"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"
}
...
}
Eliminare un record MedicalResource
I record MedicalResource
potrebbero essere eliminati in base all'ID:
// 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
)
}
)
In alternativa, possono essere eliminati da 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)
)
)