Собирайте и обрабатывайте данные о состоянии здоровья с помощью библиотеки сбора структурированных данных.

1. Прежде чем начать

Что вы построите

В этом практическом занятии вы научитесь создавать Android-приложение с использованием библиотеки Structured Data Capture Library. Ваше приложение будет использовать Structured Data Capture Library для отображения и обработки анкет и ответов FHIR.

Что вы узнаете

  • Как интегрировать библиотеку Structured Data Capture в ваше Android-приложение
  • Как разместить анкету
  • Как получить ответы в виде QuestionnaireResponse
  • Как извлечь ресурсы FHIR из QuestionnaireResponse

Что вам понадобится

Данный практический урок посвящен библиотеке 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 start screen

Запустите стартовое приложение

Теперь, когда вы импортировали проект в Android Studio, вы готовы запустить приложение в первый раз.

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

Приложение Hello World

Как видите, здесь пока не так много информации, поэтому давайте сразу перейдем к отображению анкеты в вашем приложении!

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» ( Gradle syncbutton ) из панели инструментов 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 ).

  1. Откройте activity_main.xml ( res > layout > activity_main.xml ).
  2. Параметры режимов «Код», «Разделение» и «Дизайн» находятся в правом верхнем углу редактора макетов.
  3. Выберите режим просмотра кода. Layout view options
  4. TextView вам не нужен, поэтому удалите его. Обязательно удалите всё, что находится от <TextView до закрывающего /> .
  5. Добавьте 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()
}

Узнайте больше о том, как использовать фрагменты .

Давайте запустим практическое задание, нажав кнопку «Запустить» ( Run button ) на панели инструментов 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-приложении.

Узнать больше