Wymagania dotyczące metadanych

Ten przewodnik jest zgodny z Health Connect w wersji 1.2.0-alpha05 i nowszych.

W przypadku deweloperów, którzy uaktualnią aplikację do wersji 1.1.0-alpha12 lub nowszej, w Health Connect nastąpią zmiany w metadanych.

Informacje o bibliotece

Identyfikator artefaktu wtyczki Androida do obsługi Gradle w Google Maven określa bibliotekę Health Connect, którą musisz zaktualizować. Dodaj tę zależność pakietu SDK Health Connect do pliku build.gradle na poziomie modułu:

dependencies {
  implementation "androidx.health.connect:connect-client:1.1.0-alpha12"
}

Zmiany metadanych

W pakiecie SDK Health Connect Jetpack w wersji 1.1.0-alpha12 wprowadziliśmy 2 zmiany metadanych, aby ułatwić weryfikację, czy w ekosystemie istnieją dodatkowe przydatne metadane. Jeśli w konstruktorze nie ma elementu metadata, Record może pojawić się błąd Constructor internal.

Określ metodę nagrywania

Szczegóły metadanych musisz podać za każdym razem, gdy tworzony jest obiekt typu Record().

Podczas zapisywania danych w Health Connect musisz określić jedną z 4 metod rejestrowania, używając jednej z odpowiednich metod fabrycznych do utworzenia instancji Metadata:

Metoda nagrywania Opis
RECORDING_METHOD_UNKNOWN Nie udało się zweryfikować metody nagrywania.
RECORDING_METHOD_MANUAL_ENTRY Użytkownik wprowadził dane.
RECORDING_METHOD_AUTOMATICALLY_RECORDED Dane zostały zarejestrowane przez urządzenie lub czujnik.
RECORDING_METHOD_ACTIVELY_RECORDED Użytkownik rozpoczął lub zakończył sesję nagrywania na urządzeniu.

Przykład:

 StepsRecord(
    startTime = Instant.ofEpochMilli(1234L),
    startZoneOffset = null,
    endTime = Instant.ofEpochMilli(1236L),
    endZoneOffset = null,
    metadata = Metadata.activelyRecorded(device = Device(type = Device.TYPE_WATCH)),
    count = 10
)

Typ urządzenia

Musisz określić typ urządzenia dla wszystkich automatycznie i aktywnie rejestrowanych danych. Więcej informacji znajdziesz w  Devicedokumentacji Jetpack na temat klasy. Obecnie obsługiwane typy urządzeń to:

Typ urządzenia Opis
TYPE_UNKNOWN Typ urządzenia jest nieznany.
TYPE_WATCH Typ urządzenia to zegarek.
TYPE_PHONE Typ urządzenia to telefon.
TYPE_SCALE Typ urządzenia to waga.
TYPE_RING Typem urządzenia jest dzwonek.
TYPE_HEAD_MOUNTED Typ urządzenia to urządzenie montowane na głowie.
TYPE_FITNESS_BAND Typ urządzenia to tracker fitness.
TYPE_CHEST_STRAP Typ urządzenia to pas na klatkę piersiową.
TYPE_SMART_DISPLAY Typ urządzenia to inteligentny wyświetlacz.

Niektóre wartości Device.type są dostępne tylko w nowszych wersjach Health Connect. Gdy funkcja rozszerzonych typów urządzeń jest niedostępna, te typy są traktowane jako Device.TYPE_UNKNOWN.

Rozszerzone typy urządzeń Opis
TYPE_CONSUMER_MEDICAL_DEVICE Typ urządzenia to urządzenie medyczne.
TYPE_GLASSES Typ urządzenia to para inteligentnych okularów lub okularów.
TYPE_HEARABLE Typ urządzenia to urządzenie słuchowe.
TYPE_FITNESS_MACHINE Typ urządzenia to maszyna stacjonarna.
TYPE_FITNESS_EQUIPMENT Typ urządzenia to sprzęt do ćwiczeń.
TYPE_PORTABLE_COMPUTER Typ urządzenia to komputer przenośny.
TYPE_METER Typ urządzenia to miernik.
Aby sprawdzić, czy urządzenie użytkownika obsługuje rozszerzone typy urządzeń w Health Connect, sprawdź dostępność FEATURE_EXTENDED_DEVICE_TYPES w aplikacji:

if (healthConnectClient
     .features
     .getFeatureStatus(
       HealthConnectFeatures.FEATURE_EXTENDED_DEVICE_TYPES
     ) == HealthConnectFeatures.FEATURE_STATUS_AVAILABLE) {

  // Feature is available
} else {
  // Feature isn't available
}
Więcej informacji znajdziesz w artykule Sprawdzanie dostępności funkcji.

Przykład:

 val WATCH_DEVICE = Device(
    manufacturer = "Google",
    model = "Pixel Watch",
    type = Device.TYPE_WATCH
)

// Phone
 val PHONE_DEVICE = Device(
    manufacturer = "Google",
    model = "Pixel 8",
    type = Device.TYPE_PHONE
)

// Ring
 val RING_DEVICE = Device(
    manufacturer = "Oura",
    model = "Ring Gen3",
    type = Device.TYPE_RING
)

// Scale
 val SCALE_DEVICE = Device(
    manufacturer = "Withings",
    model = "Body Comp",
    type = Device.TYPE_SCALE
)

Niepowtarzalny kod identyfikacyjny wyrobu (UDI)

W przypadku Health Connect na Androidzie 17 (poziom interfejsu API 37.1) lub U w rozszerzeniu 23 lub nowszym klasa Device obejmuje obsługę unikalnego identyfikatora urządzenia (UDI). Powiązanie zarejestrowanego modelu UDI urządzenia medycznego ze szczegółami w dokumentacji pisemnej umożliwia aplikacjom niższego szczebla (np. platformom telemedycznym lub portalom klinicznym) identyfikowanie odczytów o jakości klinicznej i odróżnianie ich od danych z ogólnodostępnych urządzeń do noszenia.

Zadeklaruj uprawnienia

Aby zapisywać szczegóły identyfikatora UDI w Health Connect, musisz zadeklarować uprawnienie WRITE_DEVICE_UDI w pliku AndroidManifest.xml aplikacji:

<uses-permission android:name="android.permission.health.WRITE_DEVICE_UDI" />

Pamiętaj, że WRITE_DEVICE_UDI to zwykłe uprawnienie. Musisz zadeklarować to uprawnienie w pliku manifestu, ale nie musisz prosić o nie użytkownika w czasie działania. Jest ono automatycznie przyznawane aplikacji w momencie instalacji.

Wpisz tylko część identyfikatora urządzenia (DI).

Pełny identyfikator UDI składa się z 2 części:

  • Identyfikator urządzenia (UDI-DI): rozpoznawany na całym świecie identyfikator przypisany do konkretnego modelu urządzenia przez agencję wydającą (np. GS1).
  • Identyfikator produkcji (UDI-PI): atrybuty specyficzne dla jednostki, takie jak numery seryjne, numery partii, daty produkcji lub daty ważności.

Aby chronić prywatność użytkowników, w Health Connect wypełniaj tylko część kodu UDI-DI. Nie podawaj żadnych atrybutów identyfikatora produkcji (takich jak numery seryjne lub numery partii).

Przykładowy kod

Uwaga: identyfikator UDI możesz ustawić podczas tworzenia instancji Device.

Pakiet SDK Jetpack

val device = Device(
    type = Device.TYPE_CONSUMER_MEDICAL_DEVICE,
    manufacturer = "Omron",
    model = "HEM-7121",
    udi = "04015674011832" // Device Identifier (UDI-DI) portion only
)

Platform API

val device = Device.Builder()
    .setType(Device.DEVICE_TYPE_CONSUMER_MEDICAL_DEVICE)
    .setManufacturer("Omron")
    .setModel("HEM-7121")
    .setUdi("04015674011832") // Device Identifier (UDI-DI) portion only
    .build()

Jeśli zapiszesz dane z identyfikatorem UDI bez zadeklarowania uprawnienia WRITE_DEVICE_UDI, Health Connect zgłosi błąd SecurityException w momencie zapisu.

Weryfikowanie dopuszczenia urządzenia do obrotu za pomocą niepowtarzalnego identyfikatora urządzenia

Health Connect pełni funkcję warstwy transportowej i nie weryfikuje autentyczności ani stanu rejestracji UDI.

Dla czytników danych obecność identyfikatora UDI oznacza, że dane pochodzą z zarejestrowanego wyrobu medycznego. Aplikacje do czytania powinny wysyłać zapytania do baz danych organów regulacyjnych, takich jak Globalna baza danych identyfikatorów urządzeń (GUDID) amerykańskiej Agencji ds. Żywności i Leków (FDA) lub europejska baza danych EUDAMED, aby weryfikować klasyfikacje urządzeń, status zezwolenia organów regulacyjnych (np. klasa I, II lub III) lub konkretne zamierzone zastosowanie.

Fragmenty zostały zaktualizowane

W przewodnikach po Health Connect wprowadziliśmy aktualizacje wszędzie tam, gdzie wymagane były nowe fragmenty kodu, aby spełnić nowe wymagania dotyczące metadanych. Przykłady znajdziesz na stronie Zapisywanie danych.

Nowe metody metadanych

Metadanych nie można już tworzyć bezpośrednio, więc użyj jednej z metod fabrykujących, aby uzyskać nową instancję metadanych. Metody fabryczne weryfikują, czy informacje o urządzeniu są podawane, gdy urządzenie lub czujnik zostały użyte do rejestrowania danych. W przypadku danych wprowadzanych ręcznie podawanie informacji o urządzeniu pozostaje opcjonalne. Każda funkcja ma 3 warianty sygnatury:

  • activelyRecorded

    • fun activelyRecorded(device: Device): Metadata.
    • fun activelyRecorded(clientRecordId: String, clientRecordVersion: Long = 0, device: Device): Metadata
    • fun activelyRecordedWithId(id: String, device: Device): Metadata
  • autoRecorded

    • fun autoRecorded(device: Device): Metadata
    • fun autoRecorded(clientRecordId: String, clientRecordVersion: Long = 0, device: Device): Metadata
    • fun autoRecordedWithId(id: String, device: Device): Metadata
  • manualEntry

    • fun manualEntry(device: Device? = null): Metadata
    • fun manualEntry(clientRecordId: String, clientRecordVersion: Long = 0, device: Device? = null): Metadata
    • fun manualEntryWithId(id: String, device: Device? = null): Metadata
  • unknownRecordingMethod

    • fun unknownRecordingMethod(device: Device? = null): Metadata
    • fun unknownRecordingMethod(clientRecordId: String, clientRecordVersion: Long = 0, device: Device? = null): Metadata
    • fun unknownRecordingMethodWithId(id: String, device: Device? = null): Metadata

Więcej informacji znajdziesz w Projekcie Android Open Source.

Dane testowe

Użyj biblioteki testowej i MetadataTestHelper, aby symulować oczekiwane wartości metadanych:

private val TEST_METADATA =
    Metadata.unknownRecordingMethod(
        clientRecordId = "clientId",
        clientRecordVersion = 1L,
        device = Device(type = Device.TYPE_UNKNOWN),
    ).populatedWithTestValues(id = "test")

Symuluje to działanie implementacji Health Connect, która automatycznie wypełnia te wartości podczas wstawiania rekordu.

W przypadku biblioteki testowej musisz dodać tę zależność pakietu SDK Health Connect do pliku build.gradle na poziomie modułu:

dependencies {
  testImplementation "androidx.health.connect:connect-testing:1.0.0-alpha02"
}

Uaktualnianie biblioteki

Główne czynności, które musisz wykonać:

  1. Zaktualizuj bibliotekę do wersji 1.1.0-alpha12.

  2. Podczas tworzenia biblioteki będą zgłaszane błędy kompilacji w miejscach, w których potrzebne są nowe metadane. Aby rozwiązać te błędy i ukończyć migrację, wprowadź te zmiany:

    • Podczas tworzenia Record musisz określić metodę nagrywania. Można to zrobić za pomocą jednej z metod fabrycznych podanych w Metadata, np. Metadata.manualEntry() lub Metadata.activelyRecorded(device = Device(...)).
    • W przypadku danych zarejestrowanych przez urządzenie należy podać jego typ, np. Device.TYPE_WATCH lub Device.TYPE_PHONE.
  3. Jeśli aplikacja zapisuje rozszerzone typy urządzeń, umieść je za FEATURE_EXTENTED_DEVICE_TYPES, aby uniknąć nieoczekiwanego TYPE_UNKNOWN na urządzeniach, na których ta funkcja nie jest dostępna.