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

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

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

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

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

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

สิ่งที่ต้องมี

  • Android Studio เวอร์ชันล่าสุด (v4.1.2+)
  • โปรแกรมจำลอง Android หรืออุปกรณ์ Android จริง
  • โค้ดตัวอย่าง
  • ความรู้พื้นฐานเกี่ยวกับการพัฒนา Android ใน Kotlin

Codelab นี้มุ่งเน้นที่ไลบรารีการบันทึกข้อมูลที่มีโครงสร้าง แนวคิดและโค้ดบล็อกที่ไม่เกี่ยวข้องจะปรากฎขึ้นและมีไว้เพื่อให้คุณคัดลอกและวางได้อย่างง่ายดาย หากยังไม่เคยสร้างแอป Android มาก่อน ให้เริ่มด้วยการสร้างแอปแรก

2. ตั้งค่า

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

หากต้องการดาวน์โหลดโค้ดสำหรับ Codelab นี้ ให้โคลนที่เก็บ 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. เพิ่มไลบรารีการดักจับข้อมูลที่มีโครงสร้างลงในโปรเจ็กต์

เพิ่มทรัพยากร Dependency สำหรับไลบรารีการบันทึกข้อมูลที่มีโครงสร้าง

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

dependencies {
    // ...

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

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

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

เลือกซิงค์โปรเจ็กต์กับไฟล์ Gradle (ปุ่มซิงค์ 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 ลงใน FragmentContainerView

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

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

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

เปิด MainActivity.kt แล้วเพิ่มโค้ดต่อไปนี้ลงในชั้นเรียน MainActivity

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

if (savedInstanceState == null) {
  supportFragmentManager.commit {
    setReorderingAllowed(true)
    add(
      R.id.fragment_container_view,
      QuestionnaireFragment.builder().setQuestionnaire(questionnaireJsonString!!).build()
    )
  }
}

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

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

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

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

หากต้องการรับคําตอบของแบบสอบถาม ให้เรียกส่วนย่อยของแบบสอบถามที่สร้างขึ้นก่อนหน้านี้ จากนั้นใช้เมธอด 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 ของไลบรารีการบันทึกข้อมูลที่มีโครงสร้าง

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

ค้นหาเมธอด 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 ที่มีทรัพยากรที่แยกออกมาอย่างน้อย 1 รายการ ซึ่งในกรณีนี้ทรัพยากรผู้ป่วยรายการเดียว

เรียกใช้แอปอีกครั้งเพื่อสร้างแอปอีกครั้งด้วยการเปลี่ยนแปลงล่าสุด เมื่อทำงานแล้ว ให้ป้อนข้อมูลแล้วแตะส่ง ในบันทึก คุณน่าจะเห็นข้อความ extraction result ที่มีการแสดงแทน JSON ของแพ็กเกจ 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. ยินดีด้วย

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

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

เท่านี้ก็เรียบร้อย

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

สรุปประเด็นที่ได้พูดถึง

  • วิธีเพิ่มไลบรารีการจับภาพข้อมูลที่มีโครงสร้างลงในแอป Android
  • วิธีใช้ QuestionnaireFragment และ ResourceMapper เพื่อทำงานกับแบบสอบถาม FHIR

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

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

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