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 にインポートしたので、アプリを初めて実行する準備ができました。
Android デバイスを USB 経由でホストに接続するか、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
にアンケートをレンダリングする機能をスターターアプリに追加します。
途中で、必要なインポートを追加するよう求められます。
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
がここに表示されます。
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
ファイルを確認できますが、構造化データ キャプチャ ライブラリの利点の一つは、レンダリングするために 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 アプリに構造化データ キャプチャ ライブラリを追加する方法
QuestionnaireFragment
とResourceMapper
を使用して FHIR アンケートを操作する方法
次のステップ
- 構造化データ キャプチャ ライブラリのドキュメントを確認する
- レンダリングされたアンケートの外観をカスタマイズする
- 独自の Android アプリに構造化データ キャプチャ ライブラリを適用する