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

คู่มือนี้ใช้ได้กับ Health Connect เวอร์ชัน 1.1.0-beta02

หากต้องการเขียนข้อมูลทางการแพทย์โดยใช้เวชระเบียนใน Health Connect ให้ทำตามขั้นตอนต่อไปนี้

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

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

หากต้องการดูว่าอุปกรณ์ของผู้ใช้รองรับเวชระเบียนใน 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>

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

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

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

โดยให้สร้างชุดสิทธิ์สำหรับประเภทข้อมูลที่จำเป็น ตรวจสอบว่าได้ประกาศสิทธิ์ในชุดไว้ใน Android manifest ก่อน

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

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

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

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

ต่อไปนี้คือตัวอย่างลักษณะของ JSON ดังกล่าว โดยใช้ AllergyIntolerance เป็นประเภททรัพยากร FHIR ซึ่งจะแมปกับประเภททรัพยากรทางการแพทย์ของ FHIR_RESOURCE_TYPE_ALLERGY_INTOLERANCE ในเวชระเบียน

{
  "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)
    )
)