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 captura de datos estructurados. Tu app usará la biblioteca de captura de datos estructurados para renderizar y procesar cuestionarios y respuestas de FHIR.

Qué aprenderás

  • Cómo integrar la biblioteca de captura de datos estructurados 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 captura de datos estructurados. Los conceptos y los bloques de código no relevantes se pasan por alto y se proporcionan para que simplemente los copies y pegues. Si no creaste apps para Android antes, puedes comenzar por crear tu primera app.

2. Prepárate

Cómo descargar 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/google/android-fhir.git

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

Importa la app a Android Studio

Comencemos importando 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 antes.

Pantalla de inicio de Android Studio

Ejecuta la app de partida

Ahora que importaste el proyecto a Android Studio, puedes ejecutar la app por primera vez.

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

App de Hello World

Como puedes ver, todavía no hay mucha información aquí, así que veamos de inmediato un cuestionario en tu app.

3. Agrega una biblioteca de captura de datos estructurados al proyecto

Agrega las dependencias de la biblioteca de captura de datos estructurados

Las dependencias de la biblioteca de captura de datos estructurados te permiten integrar esa biblioteca 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.0.0")
    implementation("androidx.fragment:fragment-ktx:1.5.5")
}

Cómo sincronizar tu proyecto con archivos Gradle

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

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

4. Mostrar un cuestionario

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

En el proceso, 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 elemento FragmentContainerView al diseño de la aplicación. Aquí es donde 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 Vista de código (Code view). Opciones de vista de diseño
  4. No necesitas la TextView, así que bórrala. Asegúrate de borrar todo desde <TextView hasta el /> de cierre.
  5. Agrega un FragmentContainerView dentro de ConstraintLayout. Tu archivo activity_main.xml debería ser similar a este:
    <?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: Agrega un elemento QuestionnaireFragment a FragmentContainerView

QuestionnaireFragment requiere un cuestionario de FHIR codificado en JSON para su renderización. Dado que el cuestionario es pequeño (menos de 512 KB), lo incluirás como String en una Bundle de argumentos que se usarán para crear el fragmento. Los cuestionarios de mayor tamaño se deben proporcionar como URI por motivos de rendimiento.

Puedes consultar el archivo questionnaire.json si lo deseas, pero uno de los beneficios de la biblioteca de captura de datos estructurados es que no necesitas conocer la estructura del cuestionario de FHIR (ni nada sobre FHIR) para lograr que lo renderice. Observarás este archivo con más detalle más adelante en el codelab.

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

Abre MainActivity.kt y agrega el siguiente código a la clase 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()
    )
  }
}

Obtén más información sobre cómo usar fragmentos.

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

Cuestionario procesado en el emulador

Navega por el cuestionario y prueba escribir algunas respuestas. Se usan algunos widgets de respuesta diferentes, incluidos valores 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 procesar 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 recibir la respuesta al cuestionario.

5. Recibe una respuesta al 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 que creaste antes y, luego, usa el método getQuestionnaireResponse(). Esto muestra un QuestionnaireResponse de FHIR de HAPI que puedes usar directamente o con otras partes del SDK de FHIR de Android. En este codelab, se usan otras bibliotecas de FHIR de HAPI para convertirla en una string JSON a fin de 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 Enviar. En el registro, deberías ver un mensaje que contiene 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 una respuesta de cuestionario

El cuestionario que se incluye en el proyecto inicial es para un flujo simple de registro de pacientes, por lo que te recomendamos que, en última instancia, uses las respuestas del cuestionario para crear un recurso para pacientes de FHIR basado en ellas. Esta conversión de una respuesta en un cuestionario a los recursos de FHIR se denomina extracción de datos. Podemos hacerlo con la clase ResourceMapper de la biblioteca de captura de datos estructurados.

Para realizar la extracción de datos, el cuestionario debe incluir información sobre cómo realizar la extracción de datos. Afortunadamente, el cuestionario de muestra ya está configurado para la extracción basada en definiciones.

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 string JSON del cuestionario anterior, y un QuestionnaireResponse, que ya mencionamos. Muestra una transacción Bundle 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 Enviar. 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 captura de datos estructurados para procesar cuestionarios y respuestas de FHIR en tu app:

  • Mostrar un cuestionario
  • Recibe una respuesta al cuestionario
  • Extrae recursos de FHIR de un QuestionnaireResponse

Eso es todo lo que necesitas para ponerlo en marcha.

A medida que avances, es posible que quieras trabajar con los recursos de FHIR de más formas en toda tu aplicación. Consulta la biblioteca para motores de FHIR del SDK de FHIR de Android a fin de 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 captura de datos estructurados 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 captura de datos estructurados
  • Personaliza el aspecto de los cuestionarios renderizados
  • Cómo aplicar la biblioteca de captura de datos estructurados en tu propia app para Android

Más información