Capture e processe dados de saúde com a biblioteca de captura de dados estruturados

1. Antes de começar

O que você vai criar

Neste codelab, você vai aprender a criar um app Android com a biblioteca de captura de dados estruturados. Seu app vai usar a biblioteca de captura de dados estruturados para renderizar e processar questionários e respostas do FHIR.

O que você vai aprender

  • Como integrar a biblioteca de captura de dados estruturados ao seu app Android
  • Como mostrar um questionário
  • Como receber respostas como um QuestionnaireResponse
  • Como extrair recursos FHIR de um QuestionnaireResponse

O que é necessário

Este codelab se concentra na biblioteca de captura de dados estruturados. Conceitos e blocos de códigos sem relevância não serão abordados. Eles são incluídos somente para você copiar e colar. Se você nunca criou apps Android, comece criando seu primeiro app.

2. Começar a configuração

Fazer o download do código

Para baixar o código deste codelab, clone o repositório do SDK FHIR Android: git clone https://github.com/google/android-fhir.git

O projeto inicial para este codelab está localizado em codelabs/datacapture.

Importar o app para o Android Studio

Vamos começar importando o app inicial para o Android Studio.

Abra o Android Studio, selecione Import Project (Gradle, Eclipse ADT, etc.) e escolha a pasta codelabs/datacapture no código-fonte que você baixou anteriormente.

Tela inicial do Android Studio

Executar o app inicial

Agora que você importou o projeto para o Android Studio, está tudo pronto para executar o app pela primeira vez.

Conecte seu dispositivo Android via USB ao host ou inicie o emulador do Android Studio e clique em "Executar" (Botão Executar) na barra de ferramentas do Android Studio.

App Hello World

Como você pode ver, ainda não há muita coisa aqui. Então, vamos mostrar um questionário no seu app!

3. Adicionar a biblioteca de captura de dados estruturados ao projeto

Adicionar as dependências da biblioteca de captura de dados estruturados

As dependências da biblioteca de captura de dados estruturados permitem integrar essa biblioteca ao seu app. Adicione as seguintes linhas ao final do arquivo app/build.gradle.kts do projeto:

dependencies {
    // ...

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

Sincronizar o projeto com arquivos do Gradle

Para garantir que todas as dependências estejam disponíveis para seu app, sincronize o projeto com os arquivos do Gradle neste momento.

Selecione Sync Project with Gradle Files (Botão de sincronização do Gradle) na barra de ferramentas do Android Studio. Você também pode executar o app novamente para verificar se as dependências estão funcionando corretamente.

4. Mostrar um questionário

Nesta etapa, você vai adicionar a funcionalidade ao app inicial para renderizar um questionário em um FragmentContainerView.

Ao longo do caminho, o Android Studio vai pedir que você adicione as importações necessárias:

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

Etapa 1: adicionar um FragmentContainerView

Adicione uma FragmentContainerView ao layout do aplicativo. É aqui que o QuestionnaireFragment que você vai criar mais tarde vai aparecer.

  1. Abra activity_main.xml (res > layout > activity_main.xml).
  2. As opções para as visualizações "Code", "Split" e "Design" ficam no canto direito de cima do Layout Editor.
  3. Selecione a Visualização de código. Opções de visualização de layout
  4. Não é preciso usar a TextView, então exclua-a. Certifique-se de excluir tudo desde <TextView até a tag /> de término.
  5. Adicione um FragmentContainerView dentro do ConstraintLayout. Seu arquivo activity_main.xml vai ficar assim:
    <?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>
    

Etapa 2: configurar um QuestionnaireFragment

O QuestionnaireFragment exige um questionário FHIR codificado em JSON para ser renderizado. Como o questionário é pequeno (<512 KB), você o incluirá como um String em um Bundle de argumentos que serão usados para criar o fragmento. Questionários maiores precisam ser fornecidos como um URI por motivos de desempenho.

Você pode consultar o arquivo questionnaire.json se quiser, mas um dos benefícios da biblioteca de captura de dados estruturados é que não é necessário conhecer a estrutura do questionário FHIR (ou qualquer coisa sobre FHIR) para renderizá-lo. Você vai analisar esse arquivo mais de perto mais tarde no codelab.

Crie uma QuestionnaireFragment usando o builder correspondente e defina o questionário usando a função setter. Para mostrar o QuestionnaireFragment no contêiner de layout, use o FragmentManager para criar um FragmentTransaction.

Abra MainActivity.kt e adicione o seguinte código à classe MainActivity:

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

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

Etapa 3: adicionar o QuestionnaireFragment ao FragmentContainerView

Para mostrar o QuestionnaireFragment no contêiner de layout, use o FragmentManager para criar um FragmentTransaction. O FragmentManager processa a instanciação usando o questionnaireParams criado anteriormente.

Adicione o seguinte código à classe 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()
}

Saiba como usar fragmentos.

Para executar o codelab, clique em Executar (Botão Executar) na barra de ferramentas do Android Studio. Você verá algo como:

Questionário renderizado no emulador

Navegue pelo questionário e tente inserir algumas respostas. Há alguns widgets de resposta diferentes usados, incluindo booleanos, texto e datas, que foram renderizados automaticamente com base no tipo subjacente no questionário FHIR original.

Tecnicamente, isso é tudo o que você precisa fazer para renderizar um questionário. Parabéns!

Um questionário não é muito útil se você não consegue ver as respostas inseridas pelos usuários. Vamos para a próxima etapa de como receber uma resposta do questionário.

5. Receber uma resposta do questionário

Nas etapas anteriores, você renderizou um questionário FHIR no seu app.

Nesta seção, você vai receber as respostas do questionário como um QuestionnaireResponse.

Encontre o método submitQuestionnaire() e adicione o seguinte 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 receber a resposta do questionário, recupere o fragmento criado anteriormente e use o método getQuestionnaireResponse(). Isso retorna um QuestionnaireResponse do HAPI FHIR, que pode ser usado diretamente ou com outras partes do SDK FHIR para Android. Este codelab usa outras bibliotecas HAPI FHIR para converter em uma string JSON e visualizar no registro.

Execute o app de novo para reconstruí-lo com as mudanças mais recentes. Quando ele estiver em execução, insira algumas informações no questionário e toque em Enviar. No registro, você vai encontrar uma mensagem com o 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. Extrair recursos FHIR de uma QuestionnaireResponse

O questionário incluído no projeto inicial é para um fluxo simples de registro de pacientes. Portanto, talvez você queira usar as respostas para criar um recurso de paciente FHIR com base nelas. Essa conversão de uma resposta do questionário em recursos do FHIR é chamada de extração de dados. Isso pode ser feito com a classe ResourceMapper da biblioteca de captura de dados estruturados.

Para realizar a extração de dados, o questionário precisa incluir informações sobre como fazer isso. Felizmente, o exemplo de questionário já está configurado para a extração baseada em definição.

Encontre o método submitQuestionnaire() e adicione o seguinte 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() exige um questionário HAPI FHIR, que pode ser criado analisando a string JSON do questionário anterior, e um QuestionnaireResponse, que já foi obtido. Ele retorna um Bundle de transação HAPI FHIR que contém um ou mais recursos extraídos. Neste caso, um único recurso de paciente.

Execute o app de novo para reconstruí-lo com as mudanças mais recentes. Quando ele estiver em execução, insira algumas informações e toque em Enviar. No registro, você vai encontrar uma mensagem extraction result com a representação JSON do pacote 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. Parabéns!

Você usou a biblioteca de captura de dados estruturados para processar questionários e respostas do FHIR no seu app:

  • Mostrar um questionário
  • Receber uma resposta do questionário
  • Extrair recursos FHIR de um QuestionnaireResponse

Isso é tudo o que você precisa para começar!

Ao continuar, talvez você queira trabalhar com recursos FHIR de mais maneiras em todo o aplicativo. Confira a Biblioteca do FHIR Engine do SDK FHIR para Android e saiba como armazenar e gerenciar recursos FHIR localmente no seu aplicativo e sincronizar dados com um servidor FHIR remoto.

O que aprendemos

  • Como adicionar a biblioteca de captura de dados estruturados ao seu app Android
  • Como usar QuestionnaireFragment e ResourceMapper para trabalhar com questionários do FHIR

Próximas etapas

  • Confira a documentação da biblioteca de captura de dados estruturados
  • Personalizar a aparência dos questionários renderizados
  • Aplicar a biblioteca Structured Data Capture no seu próprio app Android

Saiba mais