構造化データ キャプチャ ライブラリを使用して健康に関するデータをキャプチャして処理する

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 にプロジェクトがインポートされたので、アプリを初めて実行する準備が整いました。

Android デバイスを USB 経由でホストに接続するか、Android Studio エミュレータを起動して、Android Studio ツールバーの実行アイコン([実行] ボタン)をクリックします。

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. Layout Editor の右上で、[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: QuestionnaireFragmentFragmentContainerView に追加する

QuestionnaireFragment をレンダリングするには、JSON でエンコードされた FHIR 問診票が必要です。質問票は小さい(512 KB 未満)ため、フラグメントの作成に使用する引数の BundleString として含めます。これよりも大規模なアンケートは、パフォーマンス上の理由から 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()
    )
  }
}

詳しくは、フラグメントの使用方法をご覧ください。

Android Studio ツールバーの実行アイコン([実行] ボタン)をクリックして 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 を返します。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 クラスを使用します。

データ抽出を実行するには、アンケートを作成し、データ抽出の実行方法に関する情報を含める必要があります。幸いなことに、サンプルのアンケートはすでに定義ベースの抽出用に設定されています。

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(すでに取得したもの)が必要です。1 つ以上の抽出されたリソース(この場合は 1 つの Patient リソース)を含む HAPI FHIR トランザクション Bundle が返されます。

アプリを再度実行し、最新の変更を反映して再ビルドします。実行が完了したら、情報を入力して [送信] をタップします。抽出された FHIR バンドルの JSON 表現を含むメッセージ extraction result がログに表示されます。

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 エンジン ライブラリを確認し、FHIR リソースをアプリケーションでローカルに保存して管理し、データをリモート FHIR サーバーと同期する方法を確認してください。

学習した内容

  • Android アプリに構造化データ キャプチャ ライブラリを追加する方法
  • QuestionnaireFragmentResourceMapper を使用して FHIR アンケートを操作する方法

次のステップ

  • 構造化データ キャプチャ ライブラリに関するドキュメントを読む
  • レンダリングされたアンケートのデザインをカスタマイズする
  • 独自の Android アプリに構造化データ キャプチャ ライブラリを適用する

詳細