1. Antes de começar
O que você vai criar
Neste codelab, você vai aprender a criar um app Android com a Structured Data Capture Library. Seu app vai usar a Structured Data Capture Library para renderizar e processar questionários e respostas do FHIR.
O que você vai aprender
- Como integrar a Structured Data Capture Library ao seu app Android
- Como mostrar um questionário
- Como receber respostas como uma
QuestionnaireResponse - Como extrair recursos FHIR de uma
QuestionnaireResponse
O que é necessário
- Uma versão recente do Android Studio (v4.1.2 ou mais recente)
- Android Emulator ou um dispositivo Android físico
- Exemplo de código
- Conhecimento básico de desenvolvimento Android em Kotlin
Este codelab é focado na Structured Data Capture Library. 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, comece 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 Android: git clone https://github.com/ohs-foundation/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.

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 ao host por USB ou inicie o emulador do Android Studio, e clique em Run (
) na barra de ferramentas do Android Studio.

Como você pode ver, ainda não há muito aqui. Então, vamos mostrar um questionário no seu app.
3. Adicionar a Structured Data Capture Library ao projeto
Adicionar as dependências da Structured Data Capture Library
As dependências da Structured Data Capture Library permitem integrar a biblioteca 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.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 arquivos do Gradle neste momento.
Selecione Sync Project with Gradle Files (
) 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 uma FragmentContainerView.
Ao longo do caminho, o Android Studio vai pedir que você adicione as importações necessárias:
androidx.core.os.bundleOfandroidx.fragment.app.addandroidx.fragment.app.commitandroid.util.Logcom.google.android.fhir.datacapture.QuestionnaireFragment
Etapa 1: adicionar uma FragmentContainerView
Adicione uma FragmentContainerView ao layout do aplicativo. É aqui que o QuestionnaireFragment que você vai criar mais tarde será mostrado.
- Abra
activity_main.xml(res > layout > activity_main.xml). - As opções para as visualizações Code, Split e Design ficam no canto direito de cima do Layout Editor.
- Selecione a visualização de código.

- Você não precisa da
TextView, então exclua-a. Certifique-se de excluir tudo desde o<TextViewaté o/>de término. - Adicione uma
FragmentContainerViewdentro daConstraintLayout. Seu arquivoactivity_main.xmlprecisa ser semelhante 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>
Etapa 2: configurar um QuestionnaireFragment
QuestionnaireFragment exige um questionário FHIR codificado em JSON para ser renderizado. Como o questionário é pequeno (<512 KB), você o incluirá como uma String em um Bundle de argumentos que será usado 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 Structured Data Capture Library é que você não precisa conhecer a estrutura do questionário FHIR (ou qualquer coisa sobre o FHIR) para renderizá-lo. Você vai analisar esse arquivo mais de perto mais tarde no codelab.
Crie um QuestionnaireFragment usando o builder e defina o questionário usando a função setter. Para mostrar o QuestionnaireFragment no contêiner de layout, use o FragmentManager para criar uma 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 à FragmentContainerView
Para mostrar o QuestionnaireFragment no contêiner de layout, use o FragmentManager para criar uma 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 mais sobre como usar fragmentos.
Vamos executar o codelab clicando em Run (
) na barra de ferramentas do Android Studio. Você verá algo como:

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, é 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 uma 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 do questionário criado anteriormente e use o método getQuestionnaireResponse(). Isso retorna um QuestionnaireResponse do HAPI FHIR que você pode usar diretamente ou com outras partes do SDK FHIR Android. Este codelab usa outras bibliotecas do HAPI FHIR 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. Depois que ele estiver em execução, insira algumas informações no questionário e toque em Submit. No registro, você vai encontrar uma mensagem contendo a 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 do questionário para criar um recurso de paciente FHIR com base nelas. Essa conversão de uma resposta do questionário para recursos FHIR é chamada de extração de dados. Podemos fazer isso com a classe ResourceMapper da Structured Data Capture Library.
Para realizar 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 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 uma QuestionnaireResponse, que já recebemos anteriormente. Ele retorna um pacote de transações HAPI FHIR 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. Depois que ele estiver em execução, insira algumas informações e toque em Submit. No registro, você vai encontrar 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 Structured Data Capture Library 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 uma
QuestionnaireResponse
É tudo o que você precisa para começar a usar.
À medida que você avança, talvez queira trabalhar com recursos FHIR de mais maneiras no aplicativo. Confira a biblioteca FHIR Engine do SDK FHIR Android para aprender a armazenar e gerenciar recursos FHIR localmente no aplicativo e sincronizar dados com um servidor FHIR remoto.
O que aprendemos
- Como adicionar a Structured Data Capture Library ao seu app Android
- Como usar
QuestionnaireFragmenteResourceMapperpara trabalhar com questionários FHIR
Próximas etapas
- Confira a documentação da Structured Data Capture Library
- Personalizar a aparência dos questionários renderizados
- Aplicar a Structured Data Capture Library no seu próprio app Android