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

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

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

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

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

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

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

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

2. ตั้งค่า

ดาวน์โหลดรหัส

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

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

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

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

เปิด Android Studio เลือกนำเข้าโปรเจ็กต์ (Gradle, Eclipse ADT ฯลฯ) แล้วเลือกโฟลเดอร์ codelabs/datacapture จากซอร์สโค้ดที่คุณดาวน์โหลดไว้ก่อนหน้านี้

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

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

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

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

แอป Hello World

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

3. เพิ่มไลบรารีการจับภาพ Structured Data ลงในโปรเจ็กต์

เพิ่มการอ้างอิงสำหรับไลบรารีการจับภาพ Structured Data

ทรัพยากร Dependency ของไลบรารีการจับภาพ Structured Data ช่วยให้คุณผสานรวมไลบรารีการจับภาพ Structured Data ในแอปได้ เพิ่มบรรทัดต่อไปนี้ที่ส่วนท้ายของไฟล์ 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 ทั้งหมด

เลือกซิงค์โปรเจ็กต์กับไฟล์ Gradle (ปุ่มซิงค์ Gradle) จากแถบเครื่องมือของ Android Studio นอกจากนี้ คุณยังเรียกใช้แอปอีกครั้งเพื่อตรวจสอบว่าการอ้างอิงทำงานอย่างถูกต้องหรือไม่

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 คือคุณไม่จำเป็นต้องทราบโครงสร้างของแบบสอบถาม FHIR (หรือสิ่งใดก็ตามเกี่ยวกับ FHIR) เพื่อให้แสดงผล คุณจะได้ดูไฟล์นี้อย่างละเอียดในภายหลังใน Codelab

สร้าง QuestionnaireFragment โดยใช้เครื่องมือสร้าง และตั้งค่าแบบสอบถามโดยใช้ฟังก์ชัน 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()
}

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

มาเรียกใช้โค้ดแล็บโดยคลิก 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() ซึ่งจะแสดงผล QuestionnaireResponse ของ HAPI FHIR ที่คุณใช้ได้โดยตรงหรือใช้ร่วมกับส่วนอื่นๆ ของ 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

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

ค้นหาวิธี 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 ซึ่งเราได้รับแล้วก่อนหน้านี้ โดยจะแสดงผลธุรกรรม HAPI FHIR Bundle ที่มีทรัพยากรที่ดึงข้อมูลอย่างน้อย 1 รายการ ซึ่งในกรณีนี้คือทรัพยากรผู้ป่วย 1 รายการ

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

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 ลงในแอป Android
  • วิธีใช้ QuestionnaireFragment และ ResourceMapper เพื่อทำงานกับแบบสอบถาม FHIR

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

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

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