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. 構造化データ キャプチャ ライブラリをプロジェクトに追加する
構造化データ キャプチャ ライブラリの依存関係を追加する
構造化データ キャプチャ ライブラリの依存関係を使用すると、構造化データ キャプチャ ライブラリをアプリに統合できます。プロジェクトの 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]()を選択します。また、アプリを再度実行して、依存関係が正しく動作していることを確認します。
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
が表示されます。
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
を FragmentContainerView
に追加する
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")
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 アプリに構造化データ キャプチャ ライブラリを追加する方法
QuestionnaireFragment
とResourceMapper
を使用して FHIR アンケートを操作する方法
次のステップ
- 構造化データ キャプチャ ライブラリに関するドキュメントを読む
- レンダリングされたアンケートのデザインをカスタマイズする
- 独自の Android アプリに構造化データ キャプチャ ライブラリを適用する