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

O que é necessário

Este codelab é focado na Biblioteca de captura de dados estruturados (link em inglês). 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 antes, pode começar criando seu primeiro app.

2. Começar a configuração

Fazer o download do código

Para fazer o download do código deste codelab, clone o repositório do SDK FHIR do 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 ver, ainda não há muitas informações, então vamos começar a 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 linhas abaixo 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 o projeto com arquivos do Gradle

Para garantir que todas as dependências estejam disponíveis para o 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. Execute o app novamente para verificar 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.

Ao longo do caminho, o Android Studio 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 uma FragmentContainerView ao layout do aplicativo. É aqui que o QuestionnaireFragment que você vai criar mais tarde será exibido.

  1. Abra activity_main.xml (res > layout > activity_main.xml).
  2. Encontre as opções para as visualizações Code, Split e Design no canto superior direito do Layout Editor.
  3. Selecione a visualização "Code". Opções de visualização de layout
  4. Como você não precisa do TextView, exclua-o. 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 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 ao FragmentContainerView

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

Se quiser, você pode consultar o arquivo questionnaire.json, mas um dos benefícios da Biblioteca de Captura de Dados Estruturados é que não é preciso saber a estrutura do questionário FHIR (nem nada sobre o FHIR) para fazer a renderização. Você vai conhecer melhor esse arquivo mais adiante no codelab.

Crie um QuestionnaireFragment usando o builder correspondente 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. Alguns widgets de resposta diferentes foram usados, incluindo booleanos, texto e datas, que foram renderizados automaticamente com base no tipo subjacente do questionário FHIR original.

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

Um questionário não será muito útil se você não puder ver as respostas inseridas pelos usuários. Vamos para a próxima etapa para receber uma resposta ao questionário.

5. Receber uma resposta ao questionário

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

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

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 as respostas, extraia o fragmento do questionário criado anteriormente e use o método getQuestionnaireResponse(). Isso retorna um FHIR da HAPI QuestionnaireResponse que pode ser usado diretamente ou com outras partes do SDK FHIR do Android. Este codelab usa outras bibliotecas FHIR HAPI para convertê-la em uma string JSON para exibir no registro.

Execute o app novamente para recriá-lo com as mudanças mais recentes. Quando ele estiver sendo executado, insira algumas informações no questionário e toque em Enviar. No registro, você verá uma mensagem contendo 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. Extraia recursos FHIR de um QuestionnaireResponse

O questionário incluído no projeto inicial é para 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 nelas. 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 realizar a extração de dados, seu questionário precisa ser criado para incluir informações sobre como fazer 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 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() requer um questionário FHIR HAPI, que pode ser criado analisando a string JSON do questionário anterior, e um QuestionnaireResponse, que já abordamos anteriormente. Ela retorna um Bundle de transação FHIR HAPI contendo um ou mais recursos extraídos. Neste caso, um único recurso "Paciente".

Execute o app novamente para recriá-lo com as mudanças mais recentes. Quando ele estiver sendo executado, 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 app:

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

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

À medida que você prossegue, talvez queira trabalhar com recursos FHIR de mais maneiras em todo o aplicativo. Confira a Biblioteca FHIR Engine do SDK FHIR do Android para saber como armazenar e gerenciar recursos FHIR localmente em 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 os 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 próprio app Android

Saiba mais