1. 始める前に
作成するアプリの概要
この Codelab では、構造化データ キャプチャ ライブラリを使用して Android アプリを作成する方法を学びます。アプリは、構造化データ キャプチャ ライブラリを使用して FHIR 問診票と回答をレンダリングして処理します。
学習内容
- 構造化データ キャプチャ ライブラリを Android アプリケーションに統合する方法
- アンケートの表示方法
QuestionnaireResponseとして回答を取得する方法QuestionnaireResponseから FHIR リソースを抽出する方法
必要なもの
- 最新バージョンの Android Studio(v4.1.2 以降)
- Android Emulator または Android 実機
- サンプルコード
- Kotlin を使用した Android 開発の基本的な知識
この 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 にプロジェクトをインポートしたので、アプリを初めて実行する準備ができました。
USB 経由で Android デバイスをホストに接続するか、Android Studio エミュレータを起動して、Android Studio ツールバーの [実行](
)をクリックします。

ご覧のとおり、まだ何もありません。さっそくアプリにアンケートを表示してみましょう。
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](
)を選択します。アプリをもう一度実行して、依存関係が正しく機能していることを確認することもできます。
4. アンケートを表示する
このステップでは、スターター アプリに、FragmentContainerView でアンケートをレンダリングする機能を追加します。
この過程で、Android Studio から必要なインポートを追加するよう求められます。
androidx.core.os.bundleOfandroidx.fragment.app.addandroidx.fragment.app.commitandroid.util.Logcom.google.android.fhir.datacapture.QuestionnaireFragment
ステップ 1: FragmentContainerView を追加する
アプリのレイアウトに FragmentContainerView を追加します。ここに、後で作成する QuestionnaireFragment が表示されます。
activity_main.xmlを開きます([res] > [layout] > [activity_main.xml])。- Layout Editor の右上で、[Code]、[Split]、[Design] の各ビューを選択できるようになっています。
- コードビューを選択します。

TextViewは不要なため、削除します。<TextViewから終了タグの/>まで、すべての内容を削除してください。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 未満)ため、フラグメントの作成に使用される引数の Bundle の String として含めます。パフォーマンス上の理由から、大規模なアンケートは URI として提供する必要があります。
必要に応じて questionnaire.json ファイルを確認できますが、構造化データ キャプチャ ライブラリのメリットの 1 つは、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 つ以上の抽出されたリソース(この場合は単一の Patient リソース)を含む HAPI FHIR トランザクション Bundle を返します。
アプリを再度実行して、最新の変更内容で再ビルドします。実行されたら、情報を入力して [送信] をタップします。ログに、抽出された FHIR Bundle の 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 アプリに Structured Data Capture Library を追加する方法
QuestionnaireFragmentとResourceMapperを使用して FHIR アンケートを操作する方法
次のステップ
- 構造化データ キャプチャ ライブラリのドキュメントを読む
- レンダリングされたアンケートのデザインをカスタマイズする
- 独自の Android アプリで構造化データ キャプチャ ライブラリを適用する