Zbieranie i przetwarzanie danych dotyczących zdrowia za pomocą biblioteki zbierania uporządkowanych danych

1. Zanim zaczniesz

Co utworzysz

Z tego ćwiczenia dowiesz się, jak utworzyć aplikację na Androida za pomocą biblioteki Structured Data Capture Library. Twoja aplikacja będzie używać biblioteki Structured Data Capture Library do renderowania i przetwarzania kwestionariuszy FHIR oraz odpowiedzi.

Czego się nauczysz

  • Jak zintegrować bibliotekę Structured Data Capture Library z aplikacją na Androida
  • Jak wyświetlić kwestionariusz
  • Jak uzyskać odpowiedzi jako QuestionnaireResponse
  • Jak wyodrębnić zasoby FHIR z QuestionnaireResponse

Czego potrzebujesz

To ćwiczenie z programowania koncentruje się na bibliotece do rejestrowania uporządkowanych danych. Nieistotne koncepcje i bloki kodu zostały zamaskowane. Można je po prostu skopiować i wkleić. Jeśli nie tworzysz jeszcze aplikacji na Androida, możesz zacząć od utworzenia pierwszej aplikacji.

2. Konfiguracja

Pobieranie kodu

Aby pobrać kod do tego ćwiczenia, sklonuj repozytorium Android FHIR SDK: git clone https://github.com/google/android-fhir.git

Projekt startowy tego Codelab znajduje się w folderze codelabs/datacapture.

Zaimportuj aplikację do Android Studio

Zacznijmy od zaimportowania aplikacji startowej do Android Studio.

Otwórz Android Studio, wybierz Importuj projekt (Gradle, Eclipse ADT itp.) i wybierz folder codelabs/datacapture z poprzednio pobranego kodu źródłowego.

Ekran startowy Android Studio

Uruchamianie aplikacji wyjściowej

Po zaimportowaniu projektu do Android Studio możesz uruchomić aplikację po raz pierwszy.

Podłącz urządzenie z Androidem do hosta przez USB lub uruchom emulator Android Studio i kliknij Uruchom (Przycisk Uruchom) na pasku narzędzi Android Studio.

Aplikacja Cześć wszystkim

Jak widzisz, nie ma tu jeszcze zbyt wiele, więc przejdźmy do wyświetlania kwestionariusza w aplikacji.

3. Dodawanie biblioteki do tworzenia uporządkowanych danych do projektu

Dodawanie zależności biblioteki danych strukturalnych

Zależność biblioteki Structured Data Capture Library umożliwia zintegrowanie tej biblioteki w aplikacji. Dodaj te wiersze na końcu pliku app/build.gradle.kts projektu:

dependencies {
    // ...

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

Synchronizacja projektu z plikami Gradle

Aby mieć pewność, że wszystkie zależności są dostępne dla aplikacji, na tym etapie zsynchronizuj projekt z plikami Gradle.

Na pasku narzędzi Android Studio kliknij Synchronizuj projekt z plikami Gradle (Przycisk synchronizacji Gradle). Możesz też ponownie uruchomić aplikację, aby sprawdzić, czy zależności działają prawidłowo.

4. Wyświetlanie kwestionariusza

W tym kroku dodasz do aplikacji startowej funkcję renderowania kwestionariusza w FragmentContainerView.

W trakcie instalacji Android Studio poprosi Cię o dodanie niezbędnych plików importowanych:

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

Krok 1. Dodaj FragmentContainerView

Dodaj FragmentContainerView do układu aplikacji. Tutaj będą wyświetlane utworzone przez Ciebie później QuestionnaireFragment.

  1. Otwórz activity_main.xml (res > layout > activity_main.xml).
  2. W prawym górnym rogu Edytora układu znajdziesz opcje widoków Kod, Podział i Projekt.
  3. Wybierz widok kodu. Opcje widoku układu
  4. Nie potrzebujesz TextView, więc go usuń. Pamiętaj, aby usunąć wszystko od <TextView do zamykającego />.
  5. Dodaj FragmentContainerView wewnątrz ConstraintLayout. Plik activity_main.xml powinien wyglądać tak:
    <?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>
    

Krok 2. Skonfiguruj QuestionnaireFragment

Do renderowania zapytania QuestionnaireFragment wymagany jest zakodowany w formacie JSON kwestionariusz FHIR. Ponieważ kwestionariusz jest mały (mniej niż 512 KB), możesz go umieścić jako StringBundle argumentów, które zostaną użyte do utworzenia fragmentu. Ze względu na wydajność większe kwestionariusze należy przesyłać jako URI.

Jeśli chcesz, możesz przejrzeć plik questionnaire.json, ale jedną z zalet biblioteki Structured Data Capture Library jest to, że nie musisz znać struktury kwestionariusza FHIR (ani niczego o FHIR), aby go renderować. Więcej informacji o tym pliku znajdziesz w dalszej części tego modułu.

Utwórz obiekt QuestionnaireFragment za pomocą kreatora i ustaw kwestionariusz za pomocą funkcji settera. Aby wyświetlić QuestionnaireFragment w kontenerze układu, użyj elementu FragmentManager do utworzenia elementu FragmentTransaction.

Otwórz plik MainActivity.kt i dodaj do klasy MainActivity ten kod:

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

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

Krok 3. Dodaj QuestionnaireFragment do FragmentContainerView

Aby wyświetlić QuestionnaireFragment w kontenerze układu, użyj elementu FragmentManager do utworzenia elementu FragmentTransaction. Funkcja FragmentManager obsługuje instancjowanie za pomocą utworzonego wcześniej obiektu questionnaireParams.

Dodaj do klasy MainActivity ten kod:

// 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()
}

Dowiedz się więcej o korzystaniu z fragmentów.

Uruchom Codelab, klikając Uruchom (Przycisk Uruchom) na pasku narzędzi Android Studio. Powinien pojawić się ekran podobny do tego:

Questionnaire Rendered in Emulator

Przejdź przez kwestionariusz i spróbuj wpisać kilka odpowiedzi. Używaliśmy kilku różnych widżetów odpowiedzi, w tym typu logicznego, tekstu i daty, które zostały automatycznie wyrenderowane na podstawie typu w pierwotnym kwestionariuszu FHIR.

To wszystko, co musisz zrobić, aby wyrenderować kwestionariusz. Gratulacje!

Ankieta nie jest zbyt przydatna, jeśli nie możesz zobaczyć odpowiedzi użytkowników. Przejdźmy do następnego etapu uzyskiwania odpowiedzi na kwestionariusz.

5. Odpowiedź na kwestionariusz

W poprzednich krokach wyrenderowałaś/wyrenderowałeś w aplikacji kwestionariusz FHIR.

W tej sekcji otrzymasz odpowiedzi z ankiety w postaci obiektu QuestionnaireResponse.

Znajdź metodę submitQuestionnaire() i dodaj ten kod:

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

Aby uzyskać odpowiedź na kwestionariusz, pobierasz utworzony wcześniej fragment kwestionariusza, a następnie używasz metody getQuestionnaireResponse(). Zwraca to obiekt HAPI FHIR QuestionnaireResponse, którego można używać bezpośrednio lub z innymi częściami pakietu Android FHIR SDK. Ten projekt kodu używa innych bibliotek HAPI FHIR do konwertowania danych na ciąg znaków w formacie JSON, aby można je było wyświetlić w rejestrze.

Uruchom aplikację ponownie, aby ją ponownie skompilować z najnowszymi zmianami. Gdy aplikacja się uruchomi, wpisz w kwestionariuszu odpowiednie informacje i kliknij Prześlij. W logu powinien pojawić się komunikat zawierający QuestionnaireResponse w formacie 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. Wyodrębnianie zasobów FHIR z odpowiedzi na kwestionariusz

Ankieta zawarta w projekcie startowym służy do prostego procesu rejestracji pacjenta, dlatego warto użyć odpowiedzi na pytania, aby utworzyć na ich podstawie zawartość dla pacjenta w formacie FHIR. Przekształcanie odpowiedzi na pytania w zasoby FHIR nazywa się wyodrębnianiem danych. Możemy to zrobić za pomocą klasy ResourceMapper z biblioteki Structured Data Capture Library.

Aby umożliwić wyodrębnienie danych, formularz musi zawierać informacje o tym, jak to zrobić. Na szczęście przykładowy kwestionariusz jest już skonfigurowany do wyodrębniania na podstawie definicji.

Znajdź metodę submitQuestionnaire() i dodaj ten kod:

lifecycleScope.launch {
  val questionnaire =
    jsonParser.parseResource(questionnaireJsonString) as Questionnaire
  val bundle = ResourceMapper.extract(questionnaire, questionnaireResponse)
  Log.d("extraction result", jsonParser.encodeResourceToString(bundle))
}

ResourceMapper.extract() wymaga kwestionariusza HAPI FHIR, który możesz utworzyć, analizując wcześniej utworzony ciąg znaków JSON kwestionariusza, oraz QuestionnaireResponse, który już mamy. Zwraca pakiet transakcji FHIR HAPI zawierający co najmniej jeden wyekstrahowany zasób – w tym przypadku pojedynczy zasób Patient.

Uruchom aplikację ponownie, aby ją ponownie skompilować z najnowszymi zmianami. Gdy aplikacja się uruchomi, wpisz kilka informacji i kliknij Prześlij. W dzienniku powinien teraz pojawić się komunikat extraction result zawierający reprezentację w formacie JSON wyodrębnionego pakietu FHIR.

D/extraction result: {"resourceType":"Bundle","type":"transaction","entry":[{"resource":{"resourceType":"Patient","identifier":[{"value":"12345"}],"name":[{"family":"Lee","given":["Dani"]}],"birthDate":"1990-02-14"}}]}

7. Gratulacje!

w aplikacji używasz biblioteki Structured Data Capture Library do przetwarzania kwestionariuszy i odpowiedzi FHIR:

  • Wyświetlanie kwestionariusza
  • Odpowiedź na kwestionariusz
  • Wyodrębnianie zasobów FHIR z poziomu QuestionnaireResponse

To wszystko, czego potrzebujesz, aby zacząć korzystać z usługi.

W dalszej części tego artykułu omówimy bardziej szczegółowo sposób korzystania z zasobów FHIR w aplikacji. Aby dowiedzieć się, jak przechowywać zasoby FHIR lokalnie w aplikacji i nimi zarządzać oraz jak synchronizować dane z odległym serwerem FHIR, zapoznaj się z biblioteką FHIR Engine w pakiecie Android FHIR SDK.

Omówione zagadnienia

  • Dodawanie biblioteki danych strukturalnych do aplikacji na Androida
  • Jak używać funkcji QuestionnaireFragment i ResourceMapper do pracy z kwestionariuszami FHIR

Następne kroki

  • Zapoznaj się z dokumentacją Structured Data Capture Library
  • dostosowywanie wyglądu i stylu wygenerowanych kwestionariuszy,
  • Stosowanie biblioteki Structured Data Capture Library w aplikacji na Androida

Więcej informacji