Menulis data medis

Panduan ini kompatibel dengan Health Connect versi 1.1.0-beta02.

Untuk menulis data medis menggunakan Rekam Medis Pribadi (PHR) di Health Connect, ikuti langkah-langkah berikut:

  1. Memeriksa ketersediaan fitur
  2. Meminta izin tulis
  3. Membuat sumber data (MedicalDataSource)
  4. Menulis referensi medis (MedicalResource)

Ketersediaan fitur

Untuk menentukan apakah perangkat pengguna mendukung PHR di Health Connect, periksa ketersediaan FEATURE_PERSONAL_HEALTH_RECORD di klien:

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

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

Lihat Memeriksa ketersediaan fitur untuk mempelajari lebih lanjut.

Izin yang diperlukan

Menulis data medis dilindungi oleh izin berikut:

  • android.permission.health.WRITE_MEDICAL_DATA

Deklarasikan izin ini di Konsol Play untuk aplikasi Anda, serta dalam manifes aplikasi:

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

Anda bertanggung jawab untuk mendeklarasikan semua izin yang sesuai yang ingin Anda gunakan di perangkat dan aplikasi. Anda juga harus memeriksa apakah setiap izin telah diberikan oleh pengguna sebelum digunakan.

Meminta izin dari pengguna

Setelah membuat instance klien, aplikasi Anda perlu meminta izin dari pengguna. Pengguna harus diizinkan untuk memberikan atau menolak izin setiap saat.

Untuk melakukannya, buat kumpulan izin untuk jenis data yang diperlukan. Pastikan izin dalam kumpulan dideklarasikan dalam manifes Android Anda terlebih dahulu.

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

Gunakan getGrantedPermissions untuk mengetahui apakah aplikasi Anda sudah mendapatkan izin yang diperlukan. Jika belum, gunakan createRequestPermissionResultContract untuk meminta izin tersebut. Tindakan ini akan menampilkan layar izin 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)
  }
}

Karena pengguna dapat memberikan atau mencabut izin kapan saja, aplikasi Anda harus memeriksa izin yang diberikan secara berkala dan menangani skenario saat izin tersebut hilang.

Sumber Data

MedicalDataSource di Health Connect mewakili sumber data yang ditampilkan kepada pengguna, seperti organisasi layanan kesehatan, rumah sakit, atau API.

Catatan medis yang disimpan di Health Connect diatur ke dalam MedicalDataSource. Hal ini memungkinkan pemisahan catatan medis untuk individu yang sama yang berasal dari sumber yang berbeda seperti API atau sistem layanan kesehatan.

Jika semua data berasal dari sumber yang sama, aplikasi penulisan hanya perlu membuat satu MedicalDataSource. Jika data berasal dari beberapa sumber, aplikasi masih dapat membuat satu MedicalDataSource jika data tersebut direkonsiliasi dan semua data memiliki kombinasi unik dari jenis resource FHIR dan ID resource FHIR. Jika tidak, MedicalDataSource harus dibuat untuk setiap sumber data.

Semua rekam medis harus dikaitkan dengan MedicalDataSource, sehingga harus dibuat sebelum menulis resource.

Properti MedicalDataSource:

  • Nama Tampilan (wajib) - Nama tampilan yang ditampilkan kepada pengguna untuk sumber data, diidentifikasi secara unik per aplikasi penulisan.
  • URI Dasar FHIR (wajib) - Untuk data yang berasal dari server FHIR, ini harus berupa URL dasar FHIR (misalnya, https://example.com/fhir/). Beberapa sumber data dapat dikaitkan dengan URL dasar FHIR yang sama.

    Jika data dihasilkan oleh aplikasi tanpa URL FHIR, ini harus berupa URI unik dan mudah dipahami yang ditentukan oleh aplikasi (misalnya, myapp://..) yang mengarah ke sumber data.

    Misalnya, jika aplikasi klien mendukung deep linking, deep link ini dapat digunakan sebagai URI Dasar FHIR. Panjang maksimum untuk URI adalah 2.000 karakter.

  • Nama paket (diisi secara otomatis) - Aplikasi yang menulis data.

  • Versi FHIR (wajib) - Versi FHIR. Harus berupa versi yang didukung.

Membuat data MedicalDataSource

Buat data untuk setiap organisasi atau entitas layanan kesehatan yang ditautkan aplikasi Anda.

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

Menghapus data MedicalDataSource

Contoh sebelumnya menampilkan id oleh sistem saat pembuatan. Jika Anda perlu menghapus data MedicalDataSource, referensikan id yang sama:

// Delete the `MedicalDataSource` that has the specified `id`
healthConnectClient.deleteMedicalDataSourceWithData(medicalDataSource.id)

Referensi medis

MedicalResource di Health Connect mewakili resource FHIR (yang berisi rekam medis), beserta metadata.

Properti MedicalResource:

  • DataSourceId (wajib) - Sumber data seperti yang dijelaskan untuk MedicalDataSource.
  • Versi FHIR (wajib) - Versi FHIR. Harus berupa versi yang didukung.
  • Resource FHIR (wajib) Instance resource FHIR yang dienkode JSON.
  • Jenis Medical Resource (diisi secara otomatis) - kategori yang ditampilkan kepada pengguna dari resource, yang dipetakan ke izin yang ditampilkan kepada pengguna.

Menyiapkan resource FHIR dalam JSON

Sebelum menulis resource medis ke Health Connect, siapkan data resource FHIR dalam JSON. Simpan setiap JSON dalam variabelnya sendiri untuk disisipkan sebagai resource medis.

Jika Anda memerlukan bantuan terkait format JSON FHIR, lihat contoh data yang disediakan oleh organisasi HL7.

Menyisipkan atau memperbarui data MedicalResource

Gunakan UpsertMedicalResourceRequest untuk menyisipkan data MedicalResource baru atau memperbarui data MedicalResource yang ada untuk 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
            )
        )
    )

Contoh resource FHIR

Pada contoh sebelumnya, variabel medicationJsonToInsert mewakili string JSON FHIR yang valid.

Berikut adalah contoh tampilan JSON tersebut, menggunakan AllergyIntolerance sebagai jenis resource FHIR, yang akan dipetakan ke Jenis Resource Medis FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE di 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"
  }
  ...
}

Menghapus data MedicalResource

Data MedicalResource dapat dihapus berdasarkan 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
        )
    }
)

Atau, file tersebut dapat dihapus oleh 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)
    )
)