Captura y procesa datos de salud con la biblioteca de captura de datos estructurados

1. Antes de comenzar

Qué compilarás

En este codelab, aprenderás a compilar una app para Android con la biblioteca de Structured Data Capture. Tu app usará la biblioteca de Structured Data Capture para renderizar y procesar cuestionarios y respuestas de FHIR.

Qué aprenderás

  • Cómo integrar la biblioteca de Structured Data Capture en tu aplicación para Android
  • Cómo mostrar un cuestionario
  • Cómo obtener respuestas como QuestionnaireResponse
  • Cómo extraer recursos de FHIR de un QuestionnaireResponse

Requisitos

Este codelab se enfoca en la biblioteca de Structured Data Capture. Los conceptos y los bloques de código no relacionados con esos temas se abordan superficialmente y se proporcionan para que simplemente los copies y pegues. Si nunca compilaste apps para Android, puedes comenzar por compilar tu primera app.

2. Prepárate

Descarga el código

Para descargar el código de este codelab, clona el repositorio del SDK de FHIR de Android: git clone https://github.com/ohs-foundation/android-fhir.git

El proyecto inicial de este codelab se encuentra en codelabs/datacapture.

Importa la app a Android Studio

Comencemos por importar la app de partida a Android Studio.

Abre Android Studio, selecciona Import Project (Gradle, Eclipse ADT, etc.) y elige la carpeta codelabs/datacapture del código fuente que descargaste anteriormente.

Pantalla de inicio de Android Studio

Ejecuta la app de partida

Ahora que importaste el proyecto a Android Studio, tienes todo listo para ejecutar la app por primera vez.

Conecta tu dispositivo Android a través de USB a tu host o inicia el emulador de Android Studio, y haz clic en Run (Botón Ejecutar) en la barra de herramientas de Android Studio.

App de Hello World

Como puedes ver, aún no hay mucho aquí, así que pasemos directamente a mostrar un cuestionario en tu app.

3. Agrega la biblioteca de Structured Data Capture al proyecto

Agrega las dependencias de la biblioteca de Structured Data Capture

Las dependencias de la biblioteca de Structured Data Capture te permiten integrar la biblioteca de Structured Data Capture en tu app. Agrega las siguientes líneas al final del archivo app/build.gradle.kts de tu proyecto:

dependencies {
    // ...

    implementation("com.google.android.fhir:data-capture:1.2.0")
    implementation("androidx.fragment:fragment-ktx:1.6.0")
}

Sincroniza tu proyecto con archivos de Gradle

Para asegurarte de que todas las dependencias estén disponibles para tu app, debes sincronizar tu proyecto con archivos de Gradle en este punto.

Selecciona Sync Project with Gradle Files (Botón de sincronización de Gradle) en la barra de herramientas de Android Studio. También puedes volver a ejecutar la app para verificar que las dependencias funcionen correctamente.

4. Muestra un cuestionario

En este paso, agregarás la funcionalidad a la app de partida para renderizar un cuestionario en un FragmentContainerView.

En el camino, Android Studio te pedirá que agregues las importaciones necesarias:

  • androidx.core.os.bundleOf
  • androidx.fragment.app.add
  • androidx.fragment.app.commit
  • android.util.Log
  • com.google.android.fhir.datacapture.QuestionnaireFragment

Paso 1: Agrega un FragmentContainerView

Agrega un FragmentContainerView al diseño de la aplicación. Aquí se mostrará el QuestionnaireFragment que crearás más adelante.

  1. Abre activity_main.xml (res > layout > activity_main.xml).
  2. Encuentra las opciones para las vistas Code, Split y Design en la parte superior derecha del editor de diseño.
  3. Selecciona la vista de código. Opciones de vista de diseño
  4. No necesitas el TextView, así que bórralo. Asegúrate de borrar todo desde el <TextView hasta el /> de cierre.
  5. Agrega un FragmentContainerView dentro de ConstraintLayout. Tu archivo activity_main.xml debería verse de la siguiente manera:
    <?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>
    

Paso 2: Configura un QuestionnaireFragment

QuestionnaireFragment requiere un cuestionario de FHIR codificado en JSON para que se renderice. Como el cuestionario es pequeño (<512 KB), lo incluirás como un String en un Bundle de argumentos que se usará para crear el fragmento. Los cuestionarios más grandes deben proporcionarse como un URI por motivos de rendimiento.

Puedes consultar el archivo questionnaire.json si quieres, pero uno de los beneficios de la biblioteca de Structured Data Capture es que no necesitas conocer la estructura del cuestionario de FHIR (ni nada sobre FHIR) para que se renderice. Analizarás este archivo más de cerca más adelante en el codelab.

Crea un QuestionnaireFragment con su compilador y configura el cuestionario con la función setter. Para mostrar el QuestionnaireFragment dentro del contenedor de diseño, usa el FragmentManager para crear una FragmentTransaction.

Abre MainActivity.kt y agrega el siguiente código a la clase MainActivity:

// Step 2: Configure a QuestionnaireFragment
questionnaireJsonString = getStringFromAssets("questionnaire.json")

val questionnaireFragment =
  QuestionnaireFragment.builder().setQuestionnaire(questionnaireJsonString!!).build()

Paso 3: Agrega el QuestionnaireFragment al FragmentContainerView

Para mostrar el QuestionnaireFragment dentro del contenedor de diseño, usa el FragmentManager para crear una FragmentTransaction. El FragmentManager controla la instancia mediante el questionnaireParams creado anteriormente.

Agrega el siguiente código a la clase 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()
}

Obtén más información para usar fragmentos.

Para ejecutar el codelab, haz clic en Run (Botón Ejecutar) en la barra de herramientas de Android Studio. Deberías ver un resultado similar a este:

Cuestionario renderizado en el emulador

Navega por el cuestionario y prueba ingresar algunas respuestas. Se usan algunos widgets de respuesta diferentes, incluidos booleanos, texto y fechas, que se renderizaron automáticamente según el tipo subyacente en el cuestionario de FHIR original.

Técnicamente, eso es todo lo que necesitas hacer para renderizar un cuestionario. ¡Felicitaciones!

Sin embargo, un cuestionario no es muy útil si no puedes ver las respuestas que ingresan los usuarios. Pasemos al siguiente paso para obtener una respuesta del cuestionario.

5. Obtén una respuesta del cuestionario

En los pasos anteriores, renderizaste un cuestionario de FHIR en tu app.

En esta sección, obtendrás las respuestas del cuestionario como QuestionnaireResponse.

Busca el método submitQuestionnaire() y agrega el siguiente código:

// 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)

Para obtener la respuesta del cuestionario, recupera el fragmento del cuestionario creado anteriormente y, luego, usa el método getQuestionnaireResponse(). Esto muestra un QuestionnaireResponse de HAPI FHIR que puedes usar directamente o con otras partes del SDK de FHIR de Android. Este codelab usa otras bibliotecas de HAPI FHIR para convertirlo en una cadena JSON para verla en el registro.

Vuelve a ejecutar la app para volver a compilarla con los cambios más recientes. Una vez que se esté ejecutando, ingresa información en el cuestionario y presiona Submit. En el registro, deberías ver un mensaje que contenga el QuestionnaireResponse como 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. Extrae recursos de FHIR de un QuestionnaireResponse

El cuestionario incluido en el proyecto inicial es para un flujo de registro de pacientes simple, por lo que, en última instancia, es posible que desees usar las respuestas del cuestionario para crear un recurso de paciente de FHIR en función de ellas. Esta conversión de una respuesta del cuestionario a recursos de FHIR se denomina extracción de datos. Podemos hacerlo con la clase ResourceMapper de la biblioteca de Structured Data Capture.

Para realizar la extracción de datos, tu cuestionario debe estar creado para incluir información sobre cómo realizar la extracción de datos. Por suerte, el cuestionario de muestra ya está configurado para la extracción basada en la definición.

Busca el método submitQuestionnaire() y agrega el siguiente código:

lifecycleScope.launch {
  val questionnaire =
    jsonParser.parseResource(questionnaireJsonString) as Questionnaire
  val bundle = ResourceMapper.extract(questionnaire, questionnaireResponse)
  Log.d("extraction result", jsonParser.encodeResourceToString(bundle))
}

ResourceMapper.extract() requiere un cuestionario de FHIR de HAPI, que puedes crear analizando la cadena JSON del cuestionario anterior, y un QuestionnaireResponse, que ya obtuvimos antes. Muestra un paquete de transacciones de FHIR de HAPI que contiene uno o más recursos extraídos, en este caso, un solo recurso de paciente.

Vuelve a ejecutar la app para volver a compilarla con los cambios más recientes. Una vez que se esté ejecutando, ingresa información y presiona Submit. En el registro, ahora deberías ver un mensaje extraction result que contiene la representación JSON del paquete de FHIR extraído.

D/extraction result: {"resourceType":"Bundle","type":"transaction","entry":[{"resource":{"resourceType":"Patient","identifier":[{"value":"12345"}],"name":[{"family":"Lee","given":["Dani"]}],"birthDate":"1990-02-14"}}]}

7. ¡Felicitaciones!

Usaste la biblioteca de Structured Data Capture para procesar cuestionarios y respuestas de FHIR en tu app:

  • Mostrar un cuestionario
  • Obtener una respuesta del cuestionario
  • Extraer recursos de FHIR de un QuestionnaireResponse

Eso es todo lo que necesitas para ponerlo en funcionamiento.

A medida que avanzas, es posible que desees trabajar con recursos de FHIR de más maneras en toda la aplicación. Consulta la biblioteca de FHIR Engine del SDK de FHIR de Android para aprender a almacenar y administrar recursos de FHIR de forma local en tu aplicación y sincronizar datos con un servidor de FHIR remoto.

Temas abordados

  • Cómo agregar la biblioteca de Structured Data Capture a tu app para Android
  • Cómo usar QuestionnaireFragment y ResourceMapper para trabajar con cuestionarios de FHIR

Próximos pasos

  • Explora la documentación de la biblioteca de Structured Data Capture.
  • Personaliza la apariencia de los cuestionarios renderizados.
  • Aplica la biblioteca de Structured Data Capture en tu propia app para Android.

Más información