บันทึกและประมวลผลข้อมูลสุขภาพด้วยไลบรารีการบันทึกข้อมูลที่มีโครงสร้าง

1. ก่อนเริ่มต้น

สิ่งที่คุณจะได้สร้าง

ใน Codelab นี้ คุณจะได้เรียนรู้วิธีสร้างแอป Android ด้วย Structured Data Capture Library โดยแอปจะใช้ Structured Data Capture Library เพื่อแสดงผลและประมวลผลแบบสอบถามและการตอบกลับ FHIR

สิ่งที่คุณจะได้เรียนรู้

  • วิธีผสานรวม Structured Data Capture Library เข้ากับแอปพลิเคชัน Android
  • วิธีแสดงแบบสอบถาม
  • วิธีรับคำตอบเป็น QuestionnaireResponse
  • วิธีแยกทรัพยากร FHIR จาก QuestionnaireResponse

สิ่งที่คุณต้องมี

Codelab นี้มุ่งเน้นที่ Structured Data Capture Library เราจะข้ามแนวคิดและบล็อกโค้ดที่ไม่เกี่ยวข้องไป และจะให้คุณคัดลอกและวางได้ง่ายๆ หากยังไม่เคยสร้างแอป Android มาก่อน คุณสามารถเริ่มต้นด้วยการสร้างแอปแรก

2. ตั้งค่า

ดาวน์โหลดโค้ด

หากต้องการดาวน์โหลดโค้ดสำหรับ Codelab นี้ ให้โคลนที่เก็บ Android FHIR SDK โดยใช้คำสั่ง git clone https://github.com/ohs-foundation/android-fhir.git

โปรเจ็กต์เริ่มต้นสำหรับ Codelab นี้อยู่ใน codelabs/datacapture

นำเข้าแอปไปยัง Android Studio

มาเริ่มต้นด้วยการนำเข้าแอปเริ่มต้นไปยัง Android Studio

เปิด Android Studio แล้วเลือก Import Project (Gradle, Eclipse ADT, etc.) จากนั้นเลือกโฟลเดอร์ codelabs/datacapture จากซอร์สโค้ดที่คุณดาวน์โหลดไว้ก่อนหน้านี้

หน้าจอเริ่มต้นของ Android Studio

เรียกใช้แอปเริ่มต้น

เมื่อนำเข้าโปรเจ็กต์ไปยัง Android Studio แล้ว คุณก็พร้อมที่จะเรียกใช้แอปเป็นครั้งแรก

เชื่อมต่ออุปกรณ์ Android กับโฮสต์ผ่าน USB หรือ เริ่ม Android Studio Emulator, แล้วคลิก Run (ปุ่มวิ่ง) ในแถบเครื่องมือ Android Studio

แอป Hello World

อย่างที่คุณเห็นว่าตอนนี้ยังไม่มีอะไรมากนัก ดังนั้นมาเริ่มแสดงแบบสอบถามในแอปกันเลย

3. เพิ่ม Structured Data Capture Library ลงในโปรเจ็กต์

เพิ่มทรัพยากร Dependency สำหรับ Structured Data Capture Library

ทรัพยากร Dependency ของ Structured Data Capture Library ช่วยให้คุณผสานรวม Structured Data Capture Library ในแอปได้ โดยให้เพิ่มบรรทัดต่อไปนี้ที่ส่วนท้ายของไฟล์ app/build.gradle.kts ของโปรเจ็กต์

dependencies {
    // ...

    implementation("com.google.android.fhir:data-capture:1.2.0")
    implementation("androidx.fragment:fragment-ktx:1.6.0")
}

ซิงค์โปรเจ็กต์กับไฟล์ Gradle

คุณควรซิงค์โปรเจ็กต์กับไฟล์ Gradle ในตอนนี้เพื่อให้แน่ใจว่าแอปมีทรัพยากร Dependency ทั้งหมด

เลือก Sync Project with Gradle Files (ปุ่มซิงค์ Gradle) จากแถบเครื่องมือ Android Studio นอกจากนี้ คุณยังเรียกใช้แอปอีกครั้งเพื่อตรวจสอบว่าทรัพยากร Dependency ทำงานอย่างถูกต้อง

4. แสดงแบบสอบถาม

ในขั้นตอนนี้ คุณจะเพิ่มฟังก์ชันการทำงานลงในแอปเริ่มต้นเพื่อแสดงผลแบบสอบถามใน FragmentContainerView

ระหว่างดำเนินการ Android Studio จะแจ้งให้คุณเพิ่มการนำเข้าที่จำเป็น ดังนี้

  • androidx.core.os.bundleOf
  • androidx.fragment.app.add
  • androidx.fragment.app.commit
  • android.util.Log
  • com.google.android.fhir.datacapture.QuestionnaireFragment

ขั้นตอนที่ 1: เพิ่ม FragmentContainerView

เพิ่ม FragmentContainerView ลงในเลย์เอาต์ของแอปพลิเคชัน ซึ่งเป็นตำแหน่งที่จะแสดง QuestionnaireFragment ที่คุณจะสร้างขึ้นในภายหลัง

  1. เปิด activity_main.xml (res > layout > activity_main.xml)
  2. ค้นหาตัวเลือกสำหรับมุมมองโค้ด แยก และออกแบบที่ด้านขวาบนของเครื่องมือสร้างเลย์เอาต์
  3. เลือกมุมมองโค้ด ตัวเลือกมุมมองเลย์เอาต์
  4. คุณไม่จำเป็นต้องใช้ TextView จึงลบออกได้ อย่าลืมลบทุกอย่างตั้งแต่ <TextView ไปจนถึง /> ที่ปิด
  5. เพิ่ม FragmentContainerView ภายใน ConstraintLayout ไฟล์ activity_main.xml ควรมีลักษณะคล้ายกับไฟล์ต่อไปนี้
    <?xml version="1.0" encoding="utf-8" ?>
    <androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
    >
    
    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/fragment_container_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintTop_toTopOf="parent" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    

ขั้นตอนที่ 2: กำหนดค่า QuestionnaireFragment

QuestionnaireFragment ต้องใช้แบบสอบถาม FHIR ที่เข้ารหัส JSON เพื่อแสดงผล เนื่องจากแบบสอบถามมีขนาดเล็ก (<512 KB) คุณจึงจะรวมแบบสอบถามเป็น String ใน Bundle ของอาร์กิวเมนต์ที่จะใช้สร้าง Fragment ส่วนแบบสอบถามขนาดใหญ่ควรระบุเป็น URI เพื่อประสิทธิภาพ

คุณสามารถดูไฟล์ questionnaire.json ได้หากต้องการ แต่ข้อดีอย่างหนึ่งของ Structured Data Capture Library คือคุณไม่จำเป็นต้องทราบโครงสร้างของแบบสอบถาม FHIR (หรือสิ่งใดก็ตามเกี่ยวกับ FHIR) เพื่อให้แสดงผล คุณจะได้ดูไฟล์นี้อย่างละเอียดมากขึ้นในภายหลังของ Codelab

สร้าง QuestionnaireFragment โดยใช้ Builder และตั้งค่าแบบสอบถามโดยใช้ฟังก์ชัน Setter หากต้องการแสดง QuestionnaireFragment ภายในคอนเทนเนอร์เลย์เอาต์ ให้ใช้ FragmentManager เพื่อสร้าง FragmentTransaction

เปิด MainActivity.kt แล้วเพิ่มโค้ดต่อไปนี้ลงในคลาส MainActivity

// Step 2: Configure a QuestionnaireFragment
questionnaireJsonString = getStringFromAssets("questionnaire.json")

val questionnaireFragment =
  QuestionnaireFragment.builder().setQuestionnaire(questionnaireJsonString!!).build()

ขั้นตอนที่ 3: เพิ่ม QuestionnaireFragment ลงใน FragmentContainerView

หากต้องการแสดง QuestionnaireFragment ภายในคอนเทนเนอร์เลย์เอาต์ ให้ใช้ FragmentManager เพื่อสร้าง FragmentTransaction FragmentManager จะจัดการการสร้างอินสแตนซ์โดยใช้ questionnaireParams ที่สร้างไว้ก่อนหน้านี้

เพิ่มโค้ดต่อไปนี้ลงในคลาส MainActivity

// Step 3: Add the QuestionnaireFragment to the FragmentContainerView
if (savedInstanceState == null) {
  supportFragmentManager.commit {
    setReorderingAllowed(true)
    add(R.id.fragment_container_view, questionnaireFragment)
  }
}
// Submit button callback
supportFragmentManager.setFragmentResultListener(
  QuestionnaireFragment.SUBMIT_REQUEST_KEY,
  this,
) { _, _ ->
  submitQuestionnaire()
}

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้ Fragment

มาเรียกใช้ Codelab โดยคลิก Run (ปุ่มวิ่ง) ในแถบเครื่องมือ Android Studio คุณควรเห็นข้อมูลที่มีลักษณะคล้ายกับข้อมูลต่อไปนี้

แบบสอบถามที่แสดงผลในโปรแกรมจำลอง

ไปยังส่วนต่างๆ ของแบบสอบถามและลองป้อนคำตอบ ระบบใช้วิดเจ็ตคำตอบที่แตกต่างกัน 2-3 รายการ ซึ่งรวมถึงบูลีน ข้อความ และวันที่ ซึ่งแสดงผลโดยอัตโนมัติตามประเภทพื้นฐานในแบบสอบถาม FHIR ดั้งเดิม

ในทางเทคนิคแล้ว คุณต้องทำเพียงเท่านี้เพื่อแสดงผลแบบสอบถาม ยินดีด้วย

แบบสอบถามจะไม่มีประโยชน์มากนักหากคุณไม่เห็นคำตอบที่ผู้ใช้ป้อน มาไปยังขั้นตอนถัดไปในการรับการตอบกลับแบบสอบถามกันเลย

5. รับการตอบกลับแบบสอบถาม

ในขั้นตอนก่อนหน้านี้ คุณได้แสดงผลแบบสอบถาม FHIR ในแอป

ในส่วนนี้ คุณจะได้รับคำตอบจากแบบสอบถามเป็น QuestionnaireResponse

ค้นหาวิธีการ submitQuestionnaire() แล้วเพิ่มโค้ดต่อไปนี้

// Get a questionnaire response
val fragment = supportFragmentManager.findFragmentById(R.id.fragment_container_view)
        as QuestionnaireFragment
val questionnaireResponse = fragment.getQuestionnaireResponse()

// Print the response to the log
val jsonParser = FhirContext.forCached(FhirVersionEnum.R4).newJsonParser()
val questionnaireResponseString =
    jsonParser.encodeResourceToString(questionnaireResponse)
Log.d("response", questionnaireResponseString)

หากต้องการรับการตอบกลับแบบสอบถาม ให้ดึงข้อมูล Fragment แบบสอบถามที่สร้างไว้ก่อนหน้านี้ แล้วใช้วิธีการ getQuestionnaireResponse() ซึ่งจะแสดงผล HAPI FHIR QuestionnaireResponse ที่คุณสามารถใช้ได้โดยตรงหรือใช้ร่วมกับส่วนอื่นๆ ของ Android FHIR SDK Codelab นี้ใช้ไลบรารี HAPI FHIR อื่นๆ เพื่อแปลงเป็นสตริง JSON สำหรับดูในบันทึก

เรียกใช้แอปอีกครั้งเพื่อสร้างใหม่ด้วยการเปลี่ยนแปลงล่าสุด เมื่อแอปทำงานแล้ว ให้ป้อนข้อมูลบางอย่างลงในแบบสอบถาม แล้วแตะส่ง ในบันทึก คุณควรเห็นข้อความที่มี QuestionnaireResponse เป็น JSON

D/response: {"resourceType":"QuestionnaireResponse","item":[{"linkId":"PR","text":"Patient information","item":[{"linkId":"PR-name","text":"Name","item":[{"linkId":"PR-name-given","text":"First Name","answer":[{"valueString":"Dani"}]},{"linkId":"PR-name-family","text":"Family Name","answer":[{"valueString":"Lee"}]}]},{"linkId":"PR-birthdate","text":"Date of Birth","answer":[{"valueDate":"1990-02-14"}]},{"linkId":"PR-id","text":"Identifying information","item":[{"linkId":"PR-name-id-url"},{"linkId":"PR-name-id","text":"Patient Id","answer":[{"valueString":"12345"}]}]}]}]}

6. แยกทรัพยากร FHIR จาก QuestionnaireResponse

แบบสอบถามที่รวมอยู่ในโปรเจ็กต์เริ่มต้นมีไว้สำหรับขั้นตอนการลงทะเบียนผู้ป่วยแบบง่ายๆ ดังนั้นคุณอาจต้องการใช้คำตอบของแบบสอบถามเพื่อสร้างทรัพยากรผู้ป่วย FHIR ตามคำตอบเหล่านั้น การแปลงจากการตอบกลับแบบสอบถามเป็นทรัพยากร FHIR นี้เรียกว่า การดึงข้อมูล เราสามารถทำได้โดยใช้คลาส ResourceMapper ของ Structured Data Capture Library

หากต้องการดึงข้อมูล แบบสอบถามต้องได้รับการเขียนขึ้นเพื่อให้มีข้อมูลเกี่ยวกับวิธีดึงข้อมูล โชคดีที่แบบสอบถามตัวอย่างได้รับการตั้งค่าสำหรับการแยกข้อมูลตามคำจำกัดความแล้ว

ค้นหาวิธีการ submitQuestionnaire() แล้วเพิ่มโค้ดต่อไปนี้

lifecycleScope.launch {
  val questionnaire =
    jsonParser.parseResource(questionnaireJsonString) as Questionnaire
  val bundle = ResourceMapper.extract(questionnaire, questionnaireResponse)
  Log.d("extraction result", jsonParser.encodeResourceToString(bundle))
}

ResourceMapper.extract() ต้องใช้แบบสอบถาม HAPI FHIR ซึ่งคุณสร้างได้โดยการแยกวิเคราะห์สตริง JSON ของแบบสอบถามจากก่อนหน้านี้ และ QuestionnaireResponse ซึ่งเราได้รับแล้วก่อนหน้านี้ โดยจะแสดงผล Bundle ธุรกรรม HAPI FHIR ที่มีทรัพยากรที่แยกออกมาอย่างน้อย 1 รายการ ซึ่งในกรณีนี้คือทรัพยากรผู้ป่วยรายการเดียว

เรียกใช้แอปอีกครั้งเพื่อสร้างใหม่ด้วยการเปลี่ยนแปลงล่าสุด เมื่อแอปทำงานแล้ว ให้ป้อนข้อมูลบางอย่าง แล้วแตะส่ง ในบันทึก ตอนนี้คุณควรเห็นข้อความ extraction result ที่มีการแสดง JSON ของ Bundle FHIR ที่แยกออกมา

D/extraction result: {"resourceType":"Bundle","type":"transaction","entry":[{"resource":{"resourceType":"Patient","identifier":[{"value":"12345"}],"name":[{"family":"Lee","given":["Dani"]}],"birthDate":"1990-02-14"}}]}

7. ยินดีด้วย

คุณได้ใช้ Structured Data Capture Library เพื่อประมวลผลแบบสอบถามและการตอบกลับ FHIR ในแอปแล้ว ดังนี้

  • แสดงแบบสอบถาม
  • รับการตอบกลับแบบสอบถาม
  • แยกทรัพยากร FHIR จาก QuestionnaireResponse

เพียงเท่านี้คุณก็พร้อมใช้งานแล้ว

เมื่อดำเนินการต่อ คุณอาจต้องการใช้ทรัพยากร FHIR ในรูปแบบอื่นๆ ทั่วทั้งแอปพลิเคชัน ดูไลบรารี FHIR Engine ของ Android FHIR SDK เพื่อเรียนรู้วิธีจัดเก็บและจัดการทรัพยากร FHIR ในแอปพลิเคชันของคุณแบบโลคัล รวมถึงซิงค์ข้อมูลกับเซิร์ฟเวอร์ FHIR ระยะไกล

สิ่งที่เราได้พูดถึงไปแล้ว

  • วิธีเพิ่ม Structured Data Capture Library ลงในแอป Android
  • วิธีใช้ QuestionnaireFragment และ ResourceMapper เพื่อทำงานกับแบบสอบถาม FHIR

ขั้นตอนถัดไป

  • สำรวจเอกสารประกอบสำหรับ Structured Data Capture Library
  • ปรับแต่งรูปลักษณ์ของแบบสอบถามที่แสดงผล
  • ใช้ Structured Data Capture Library ในแอป Android ของคุณเอง

ดูข้อมูลเพิ่มเติม