1. Прежде чем начать
Что вы построите
В этом практическом занятии вы научитесь создавать Android-приложение с использованием библиотеки Structured Data Capture Library. Ваше приложение будет использовать Structured Data Capture Library для отображения и обработки анкет и ответов FHIR.
Что вы узнаете
- Как интегрировать библиотеку Structured Data Capture в ваше Android-приложение
- Как разместить анкету
- Как получить ответы в виде
QuestionnaireResponse - Как извлечь ресурсы FHIR из
QuestionnaireResponse
Что вам понадобится
- Последняя версия Android Studio (v4.1.2+)
- Эмулятор Android или физическое устройство Android.
- Пример кода
- Базовые знания разработки под Android на Kotlin.
Данный практический урок посвящен библиотеке Structured Data Capture Library ( DSC). Несущественные концепции и блоки кода опущены и предоставлены для простого копирования и вставки. Если вы раньше не создавали приложения для Android, вы можете начать с разработки своего первого приложения .
2. Настройка
Скачать код
Чтобы загрузить код для этого практического занятия, клонируйте репозиторий Android FHIR SDK: git clone https://github.com/google/android-fhir.git
Стартовый проект для этого практического занятия находится в codelabs/datacapture .
Импортируйте приложение в Android Studio.
Начнём с импорта стартового приложения в Android Studio.
Откройте Android Studio, выберите «Импорт проекта» (Gradle, Eclipse ADT и т. д.) и выберите папку codelabs/datacapture из исходного кода, который вы скачали ранее.

Запустите стартовое приложение
Теперь, когда вы импортировали проект в Android Studio, вы готовы запустить приложение в первый раз.
Подключите ваше Android-устройство через USB к хосту или запустите эмулятор Android Studio и нажмите «Запустить» (
) на панели инструментов Android Studio.

Как видите, здесь пока не так много информации, поэтому давайте сразу перейдем к отображению анкеты в вашем приложении!
3. Добавьте в проект библиотеку для сбора структурированных данных.
Добавьте зависимости для библиотеки Structured Data Capture.
Зависимости библиотеки Structured Data Capture позволяют интегрировать её в ваше приложение. Добавьте следующие строки в конец файла 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.
Выберите «Синхронизировать проект с файлами Gradle» (
) из панели инструментов Android Studio. Вы также можете запустить приложение еще раз, чтобы проверить корректность работы зависимостей.
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 ). - Параметры режимов «Код», «Разделение» и «Дизайн» находятся в правом верхнем углу редактора макетов.
- Выберите режим просмотра кода.

-
TextViewвам не нужен, поэтому удалите его. Обязательно удалите всё, что находится от<TextViewдо закрывающего/>. - Добавьте
FragmentContainerViewвнутрьConstraintLayout. Ваш файл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 КБ), её следует включить в качестве String в Bundle аргументов, используемых для создания фрагмента. Более крупные анкеты следует предоставлять в виде URI по соображениям производительности.
Вы можете посмотреть файл questionnaire.json если хотите, но одно из преимуществ библиотеки Structured Data Capture Library заключается в том, что вам не нужно знать структуру анкеты FHIR (или что-либо о FHIR), чтобы она её отобразила! Вы подробнее изучите этот файл позже в практическом занятии.
Создайте объект 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. Вы должны увидеть что-то подобное:

Пройдите по анкете и попробуйте ввести несколько ответов. Используется несколько различных элементов ввода ответов, включая логические значения, текст и даты, которые были автоматически отображены на основе базового типа данных в оригинальной анкете 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. В этом практическом задании используются другие библиотеки 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 из ответа на анкету.
Анкета, включенная в стартовый проект, предназначена для простой регистрации пациентов, поэтому в конечном итоге вы можете использовать ответы на анкету для создания на их основе ресурса FHIR Patient . Преобразование ответов на анкету в ресурсы FHIR называется извлечением данных . Это можно сделать с помощью класса ResourceMapper из библиотеки Structured Data Capture.
Для извлечения данных ваш опросник должен содержать информацию о том, как это сделать. К счастью, пример опросника уже настроен для извлечения данных на основе определений .
Найдите метод 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 Questionnaire, который можно создать, проанализировав строку JSON с анкетой, полученную ранее, и объекта QuestionnaireResponse , который мы уже получили ранее. Он возвращает объект HAPI FHIR transaction Bundle , содержащий один или несколько извлеченных ресурсов — в данном случае, один ресурс Patient.
Запустите приложение еще раз, чтобы пересобрать его с учетом последних изменений. После запуска введите некоторую информацию и нажмите «Отправить» . В журнале вы должны увидеть extraction result сообщения, содержащий JSON-представление извлеченного FHIR-пакета.
D/extraction result: {"resourceType":"Bundle","type":"transaction","entry":[{"resource":{"resourceType":"Patient","identifier":[{"value":"12345"}],"name":[{"family":"Lee","given":["Dani"]}],"birthDate":"1990-02-14"}}]}
7. Поздравляем!
Вы использовали библиотеку Structured Data Capture для обработки анкет и ответов FHIR в вашем приложении:
- Показать анкету
- Получить ответ на анкету
- Извлечение ресурсов FHIR из
QuestionnaireResponse
Это всё, что вам нужно, чтобы запустить его!
По мере продвижения вы можете захотеть использовать ресурсы FHIR различными способами в своем приложении. Ознакомьтесь с библиотекой FHIR Engine Library из Android FHIR SDK, чтобы узнать, как хранить и управлять ресурсами FHIR локально в вашем приложении и синхронизировать данные с удаленным сервером FHIR.
Что мы рассмотрели
- Как добавить библиотеку для сбора структурированных данных в ваше Android-приложение
- Как использовать
QuestionnaireFragmentиResourceMapperдля работы с анкетами FHIR
Следующие шаги
- Изучите документацию по библиотеке захвата структурированных данных.
- Настройте внешний вид и функциональность отображаемых анкет.
- Примените библиотеку Structured Data Capture в своем собственном Android-приложении.