1. Antes de começar
O que você vai criar
Neste codelab, você vai aprender a criar um app Android com a biblioteca Structured Data Capture. Seu app vai usar a biblioteca Structured Data Capture para renderizar e processar questionários e respostas do FHIR.
O que você vai aprender
- Como integrar a biblioteca Structured Data Capture ao seu aplicativo Android
- Como mostrar um questionário
- Como receber respostas como
QuestionnaireResponse
- Como extrair recursos FHIR de um
QuestionnaireResponse
O que é necessário
- Uma versão recente do Android Studio (v4.1.2+).
- Android Emulator ou um dispositivo Android físico
- Código de amostra
- Conhecimento básico de desenvolvimento para Android em Kotlin
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ê ainda não 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 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 no Android Studio.
Abra o Android Studio, selecione Import Project (Gradle, Eclipse ADT, etc.) e escolha a pasta codelabs/datacapture
do código-fonte que você salvou 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. Vamos começar a mostrar um questionário no seu app.
3. Adicionar a biblioteca de captura de dados estruturados ao projeto
Adicionar as dependências da biblioteca Structured Data Capture
As dependências da biblioteca Structured Data Capture permitem integrar a biblioteca ao seu app. Adicione as linhas a seguir 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 o app, sincronize o projeto com os arquivos do Gradle.
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 um FragmentContainerView
.
Ao longo do caminho, 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 uma FragmentContainerView
ao layout do aplicativo. É aqui que o QuestionnaireFragment
que você vai criar mais tarde vai aparecer.
- Abra
activity_main.xml
(res > layout > activity_main.xml). - As opções para as visualizações "Code", "Split" e "Design" ficam no canto superior direito do Layout Editor.
- Selecione a visualização "Code".
- Não é preciso usar a
TextView
, então exclua-a. Certifique-se de excluir tudo desde<TextView
até a tag/>
de término. - Adicione uma
FragmentContainerView
dentro daConstraintLayout
. O arquivoactivity_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
QuestionnaireFragment
exige um questionário FHIR codificado em JSON para renderização. Como o questionário é pequeno (<512 KB), ele será incluído como um String
em um Bundle
de argumentos que serão usados para criar o fragmento. Formulários maiores devem ser enviados 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 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 detalhadamente mais adiante no codelab.
Crie uma QuestionnaireFragment
usando o builder correspondente e defina o questionário usando a função de definição. 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 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 no questionário original do FHIR.
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 que os usuários enviam. Vamos para a próxima etapa de recebimento de uma resposta do questionário.
5. Receber uma resposta de questionário
Nas etapas anteriores, você renderizou um questionário FHIR no 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 pode ser usado diretamente ou com outras partes do SDK do FHIR do Android. Este codelab usa outras bibliotecas HAPI FHIR para converter em uma string JSON para exibir no registro.
Execute o app novamente para recriar com as mudanças mais recentes. Quando 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 do questionário para criar um recurso de paciente FHIR com base nelas. Essa conversão de uma resposta do questionário para recursos do FHIR é chamada de extração de dados. Isso pode ser feito com a classe ResourceMapper
da biblioteca Structured Data Capture.
Para realizar a extração de dados, o questionário precisa incluir informações sobre como realizar a extração. Felizmente, o questionário de exemplo 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))
}
O 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á recebemos. Ele retorna um pacote de transação HAPI FHIR contendo um ou mais recursos extraídos. Neste caso, um único recurso de paciente.
Execute o app novamente para recriar 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
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 Structured Data Capture para processar questionários e respostas do FHIR no seu app:
- Mostrar um questionário
- Receber uma resposta de questionário
- Extrair recursos FHIR de um
QuestionnaireResponse
Isso é 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 seu aplicativo. Confira a biblioteca FHIR Engine do SDK do Android FHIR para saber 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 Structured Data Capture ao seu app Android
- Como usar
QuestionnaireFragment
eResourceMapper
para trabalhar com questionários do FHIR
Próximas etapas
- Acesse 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 app Android