เขียนข้อมูลทางการแพทย์

คำแนะนำนี้ใช้ได้กับ Health Connect เวอร์ชัน 1.1.0-beta02

หากต้องการเขียนข้อมูลทางการแพทย์โดยใช้บันทึกสุขภาพส่วนบุคคล (PHR) ใน Health Connect ให้ทำตามขั้นตอนต่อไปนี้

  1. ตรวจสอบความพร้อมใช้งานของฟีเจอร์
  2. ขอสิทธิ์เขียน
  3. สร้างแหล่งข้อมูล (MedicalDataSource)
  4. เขียนแหล่งข้อมูลทางการแพทย์ (MedicalResource)

ความพร้อมในการใช้งานฟีเจอร์

หากต้องการตรวจสอบว่าอุปกรณ์ของผู้ใช้รองรับ PHR ใน 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 สําหรับแอปของคุณ รวมถึงในไฟล์ Manifest ของแอป

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

คุณมีหน้าที่รับผิดชอบในการประกาศสิทธิ์ที่เหมาะสมทั้งหมดที่ตั้งใจจะใช้ในอุปกรณ์และแอป นอกจากนี้ คุณควรตรวจสอบว่าผู้ใช้ได้ให้สิทธิ์แต่ละรายการแล้วก่อนใช้งาน

ขอสิทธิ์จากผู้ใช้

หลังจากสร้างอินสแตนซ์ไคลเอ็นต์แล้ว แอปของคุณจะต้องขอสิทธิ์จากผู้ใช้ ผู้ใช้ต้องได้รับอนุญาตให้ให้หรือปฏิเสธสิทธิ์ได้ทุกเมื่อ

โดยสร้างชุดสิทธิ์สำหรับประเภทข้อมูลที่จำเป็น ตรวจสอบว่าได้ประกาศสิทธิ์ในชุดในไฟล์ Manifest ของ 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 นี้ก่อนเขียนทรัพยากร

คุณสมบัติของ MedicalDataSource

  • ชื่อที่แสดง (ต้องระบุ) - ชื่อที่แสดงต่อผู้ใช้สําหรับแหล่งข้อมูล ซึ่งระบุได้โดยไม่ซ้ำกันสําหรับแอปการเขียนแต่ละแอป
  • FHIR Base URI (ต้องระบุ) - สำหรับข้อมูลที่มาจากเซิร์ฟเวอร์ FHIR ข้อมูลนี้ควรเป็น FHIR Base URL (เช่น https://example.com/fhir/) แหล่งข้อมูลหลายแห่งจะเชื่อมโยงกับ FHIR Base URL เดียวกันได้

    หากแอปสร้างข้อมูลโดยไม่มี URL FHIR ข้อมูลนี้ควรเป็น URI ที่ไม่ซ้ำกันและเข้าใจง่ายซึ่งแอปกำหนด (เช่น myapp://..) ที่ชี้ไปยังแหล่งที่มาของข้อมูล

    ตัวอย่างเช่น หากแอปไคลเอ็นต์รองรับการทำ Deep Link ก็อาจใช้ Deep Link นี้เป็น FHIR Base URI ได้ ความยาวสูงสุดของ 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ระเบียนใหม่หรืออัปเดต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 แสดงสตริง FHIR JSON ที่ถูกต้อง

ต่อไปนี้คือตัวอย่างลักษณะของ 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)
    )
)