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ê aprenderá a criar um app Android com a biblioteca de captura de dados estruturados. Seu app usará a biblioteca de captura de dados estruturados para renderizar e processar questionários e respostas FHIR.

O que você vai aprender

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

Pré-requisitos

O foco deste codelab é a 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 fazer o download do código para este codelab, clone o repositório do SDK FHIR Android: git clone https://github.com/google/android-fhir.git

O projeto inicial deste 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 o dispositivo Android via USB ao host ou Inicie o emulador do Android Studio e clique em Run (Botão Executar) na barra de ferramentas do Android Studio.

App Hello World

Como você pode notar, ainda não há muito aqui, então vamos exibir 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 que você integre a biblioteca de captura de dados estruturados ao seu app. Adicione as seguintes linhas ao final do arquivo app/build.gradle.kts do seu projeto:

dependencies {
    // ...

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

Sincronizar seu projeto com arquivos do Gradle

Para garantir que todas as dependências estejam disponíveis para o app, sincronize seu 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. Execute o app novamente para conferir se as dependências estão funcionando corretamente.

4. Exibir um questionário

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

Durante o processo, o Android Studio vai solicitar 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 um FragmentContainerView ao layout do aplicativo. É aqui que o QuestionnaireFragment que você vai criar será exibido.

  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 superior direito do Layout Editor.
  3. Selecione a Visualização de código. Opções de visualização de layout
  4. Você não precisa do TextView, então exclua-o. Certifique-se de excluir tudo desde <TextView até a tag /> de término.
  5. Adicione um FragmentContainerView ao ConstraintLayout. O arquivo activity_main.xml vai ficar parecido com 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>
    

Etapa 2: adicionar um QuestionnaireFragment à FragmentContainerView

QuestionnaireFragment requer um questionário FHIR codificado em JSON para renderizar. Como o questionário é pequeno (menos de 512 KB), ele será incluído como um String em um Bundle de argumentos que vão ser usados para criar o fragmento. Questionários maiores precisam ser enviados como um URI para melhorar a performance.

Você pode analisar o arquivo questionnaire.json se quiser, mas um dos benefícios da biblioteca de captura de dados estruturados é que você não precisa saber a estrutura do questionário FHIR (nem nada sobre o FHIR) para que ele seja renderizado. Você vai analisar mais detalhes desse arquivo mais adiante neste codelab.

Crie um QuestionnaireFragment usando o builder dele e defina o questionário com 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")

if (savedInstanceState == null) {
  supportFragmentManager.commit {
    setReorderingAllowed(true)
    add(
      R.id.fragment_container_view,
      QuestionnaireFragment.builder().setQuestionnaire(questionnaireJsonString!!).build()
    )
  }
}

Saiba mais sobre como usar fragmentos.

Para executar o codelab, clique em Run (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 do questionário FHIR original.

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

Um questionário não é muito útil quando você não consegue ver as respostas inseridas pelos usuários. Vamos para a próxima etapa para obter a resposta ao questionário.

5. Receber uma resposta ao questionário

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

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

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

Execute o app novamente para recriá-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ê verá uma mensagem contendo 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 é destinado a um fluxo simples de registro de pacientes. Portanto, talvez você queira usar as respostas do questionário para criar um recurso de paciente FHIR com base neles. Essa conversão de uma resposta de questionário para recursos FHIR é chamada de extração de dados. Podemos fazer isso com a classe ResourceMapper da biblioteca de captura de dados estruturados.

Para executar a extração de dados, o questionário precisa ser criado para incluir informações sobre como realizar a extração de dados. Felizmente, o questionário de amostra já está configurado para Extração baseada em definição.

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

Execute o app novamente para recriá-lo com as mudanças mais recentes. Quando ele estiver em execução, insira algumas informações e toque em Enviar. No registro, você verá uma mensagem extraction result contendo 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 FHIR no seu app:

  • Exibir um questionário
  • Receber uma resposta ao questionário
  • Extrair recursos FHIR de um QuestionnaireResponse

Isso é tudo de que você precisa para começar a usá-lo.

À medida que avançar, talvez você queira trabalhar com recursos FHIR de mais maneiras em todo o aplicativo. Consulte a Biblioteca FHIR Engine do SDK FHIR Android para aprender a 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 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 de captura de dados estruturados no seu app Android

Saiba mais