使用结构化数据捕获库捕获和处理健康数据

1. 准备工作

构建内容

在此 Codelab 中,您将学习如何使用结构化数据捕获库构建 Android 应用。您的应用将使用结构化数据捕获库来渲染和处理 FHIR 调查问卷和响应。

学习内容

  • 如何将结构化数据捕获库集成到 Android 应用中
  • 如何显示调查问卷
  • 如何以QuestionnaireResponse的身份获得解答
  • 如何从 QuestionnaireResponse 提取 FHIR 资源

所需条件

此 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,选择 Import Project (Gradle, Eclipse ADT, etc.),然后从您之前下载的源代码中选择 codelabs/datacapture 文件夹。

Android Studio 开始屏幕

运行起始应用

现在,您已将项目导入 Android Studio,可以首次运行应用了。

通过 USB 将 Android 设备连接到主机,或启动 Android Studio 模拟器,然后点击 Android Studio 工具栏中的“Run”(“Run”按钮)。

Hello World 应用

如您所见,此处的内容尚不多,因此我们直接在您的应用中显示调查问卷!

3. 将结构化数据捕获库添加到项目中

为结构化数据捕获库添加依赖项

借助结构化数据捕获库依赖项,您可以将结构化数据捕获库集成到应用中。将以下代码行添加到项目的 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 文件同步。

从 Android Studio 工具栏中选择 Sync Project with Gradle Files (Gradle 同步按钮)。您还可以再次运行应用,检查依赖项是否正常运行。

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. 在布局编辑器的右上角找到 Code、Split 和 Design 视图选项。
  3. 选择“代码”视图。布局视图选项
  4. 您不需要 TextView,因此请将其删除。请务必删除从 <TextView 到结束标记 /> 之间的所有内容。
  5. ConstraintLayout 内添加一个 FragmentContainerView。您的 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”需要 JSON 编码的 FHIR 调查问卷才能呈现。由于调查问卷很小 (<512 KB),因此您需要将其作为 String 包含在用于创建 fragment 的参数 Bundle 中。出于效果方面的考虑,规模较大的调查问卷应以URI的形式提供。

如果需要,您可以查看 questionnaire.json 文件,但结构化数据捕获库的一个好处是,您无需了解 FHIR 调查问卷(或有关 FHIR)的结构,即可对其进行渲染!此 Codelab 稍后会详细介绍此文件。

使用构建器创建 QuestionnaireFragment,然后使用 setter 函数设置调查问卷。如需在布局容器中显示 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

让我们点击 Android Studio 工具栏中的“Run”(“Run”按钮) 来运行此 Codelab。您应该会看到如下所示的内容:

在模拟器中呈现的调查问卷

浏览调查问卷并尝试输入一些答案。系统会使用一些不同的答案微件(包括布尔值、文本和日期),这些微件根据原始 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 字符串,以便在日志中查看。

再次运行应用,以使用最新更改重新构建该应用。表单运行后,在调查问卷中输入一些信息,然后点按提交。在日志中,您应该会看到一条包含 JSON 格式的 QuestionnaireResponse 的消息。

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 事务 Bundle(在本例中为单个患者资源)。

再次运行应用,以使用最新更改重新构建该应用。广告开始投放后,输入一些信息,然后点按提交。在日志中,您现在应该看到一条消息 extraction result,其中包含提取的 FHIR 包的 JSON 表示法。

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 调查问卷和回复:

  • 显示调查问卷
  • 获取调查问卷回复
  • QuestionnaireResponse 中提取 FHIR 资源

您只需完成这些操作即可启动并运行!

在继续操作时,您可能希望在整个应用中以更多方式使用 FHIR 资源。查看 Android FHIR SDK 的 FHIR Engine 库,了解如何在应用本地存储和管理 FHIR 资源,以及如何与远程 FHIR 服务器同步数据。

所学内容

  • 如何向 Android 应用添加结构化数据捕获库
  • 如何使用 QuestionnaireFragmentResourceMapper 处理 FHIR 调查问卷

后续步骤

  • 浏览结构化数据捕获库的文档
  • 自定义所呈现调查问卷的外观和风格
  • 在您自己的 Android 应用中应用结构化数据捕获库

了解详情