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

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. プロジェクトに構造化データ キャプチャ ライブラリを追加する

構造化データ キャプチャ ライブラリの依存関係を追加する

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 ファイルと同期する必要があります。

Android Studio のツールバーから [Sync Project with Gradle Files](Gradle 同期ボタン)を選択します。アプリをもう一度実行して、依存関係が正しく動作していることを確認することもできます。

4. アンケートを表示する

このステップでは、FragmentContainerView にアンケートをレンダリングする機能をスターターアプリに追加します。

途中で、必要なインポートを追加するよう求められます。

  • 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: QuestionnaireFragment を構成する

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")

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()
}

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

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 が返されます。これは、直接使用することも、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. QuestionnaireResponse から FHIR リソースを抽出する

スターター プロジェクトに含まれているアンケートは、単純な患者登録フローを対象としています。最終的には、アンケート回答に基づいて FHIR Patient リソースを作成することをおすすめします。アンケート回答から 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 つ以上のリソース(この場合は単一の患者リソース)を含む HAPI FHIR トランザクション バンドルを返します。

アプリをもう一度実行して、最新の変更を加えて再ビルドします。実行が開始したら、情報を入力して [送信] をタップします。ログに、抽出された 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 アプリに構造化データ キャプチャ ライブラリを適用する

詳細