Requisitos de metadados

Este guia é compatível com a versão 1.2.0-alpha05 ou mais recente do app Conexão Saúde.

Há mudanças nos metadados do Conexão Saúde para desenvolvedores que fizerem upgrade para a versão 1.1.0-alpha12 ou mais recente.

Informações da biblioteca

O ID do artefato do plug-in do Android para Gradle do Maven do Google identifica a biblioteca Conexão Saúde para que você precisa fazer upgrade. Adicione esta dependência do SDK do Conexão Saúde ao arquivo build.gradle no nível do módulo:

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

Mudanças em metadados

Duas mudanças de metadados foram introduzidas no SDK do Jetpack do Conexão Saúde a partir da versão 1.1.0-alpha12 para ajudar a verificar se há outros metadados úteis no ecossistema. Se metadata não estiver incluído no construtor Record, talvez você veja um erro Constructor internal.

Especificar o método de gravação

É preciso especificar detalhes de metadados sempre que um objeto do tipo Record() for instanciado.

Ao gravar dados na Conexão Saúde, é necessário especificar um dos quatro métodos de gravação usando um dos métodos de fábrica correspondentes para instanciar Metadata:

Método de gravação Descrição
RECORDING_METHOD_UNKNOWN Não é possível verificar o método de gravação.
RECORDING_METHOD_MANUAL_ENTRY O usuário inseriu os dados.
RECORDING_METHOD_AUTOMATICALLY_RECORDED Um dispositivo ou sensor registrou os dados.
RECORDING_METHOD_ACTIVELY_RECORDED O usuário iniciou ou encerrou a sessão de gravação em um dispositivo.

Exemplo:

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

Tipo de dispositivo

É necessário especificar um tipo de dispositivo para todos os dados registrados de forma automática e ativa. Para mais detalhes, consulte a classe Device na documentação do Jetpack. Os tipos de dispositivo atuais incluem:

Tipo de dispositivo Descrição
TYPE_UNKNOWN O tipo do dispositivo é desconhecido.
TYPE_WATCH O tipo de dispositivo é um relógio.
TYPE_PHONE O tipo de dispositivo é um smartphone.
TYPE_SCALE O tipo de dispositivo é uma balança.
TYPE_RING O tipo de dispositivo é um anel.
TYPE_HEAD_MOUNTED O tipo de dispositivo é um dispositivo de realidade virtual.
TYPE_FITNESS_BAND O tipo de dispositivo é uma pulseira fitness.
TYPE_CHEST_STRAP O tipo de dispositivo é uma cinta peitoral.
TYPE_SMART_DISPLAY O tipo de dispositivo é um smart display.

Alguns valores de Device.type só estão disponíveis em versões mais recentes do Conexão Saúde. Quando o recurso de tipos de dispositivos estendidos não está disponível, esses tipos são tratados como Device.TYPE_UNKNOWN.

Tipos de dispositivos estendidos Descrição
TYPE_CONSUMER_MEDICAL_DEVICE O tipo de dispositivo é dispositivo médico.
TYPE_GLASSES O tipo de dispositivo é um par de óculos inteligentes.
TYPE_HEARABLE O tipo de dispositivo é um dispositivo de áudio.
TYPE_FITNESS_MACHINE O tipo de dispositivo é uma máquina estacionária.
TYPE_FITNESS_EQUIPMENT O tipo de dispositivo é um equipamento de ginástica.
TYPE_PORTABLE_COMPUTER O tipo de dispositivo é um computador portátil.
TYPE_METER O tipo de dispositivo é um medidor.
Para determinar se o dispositivo de um usuário é compatível com os tipos de dispositivo estendidos no app Conexão Saúde, verifique a disponibilidade de FEATURE_EXTENDED_DEVICE_TYPES no cliente:

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

  // Feature is available
} else {
  // Feature isn't available
}
Consulte Verificar a disponibilidade de recursos para saber mais.

Exemplo:

 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
)

Identificador exclusivo do dispositivo (UDI)

Para o Conexão Saúde no Android 17 (nível 37.1 da API) ou na extensão U 23 ou mais recente, a classe Device inclui suporte ao identificador exclusivo de dispositivo (UDI, na sigla em inglês). Associar os detalhes do modelo de UDI registrado de um dispositivo médico aos seus registros escritos permite que aplicativos downstream (como plataformas de telessaúde ou portais clínicos) identifiquem leituras de nível clínico e as diferenciem de dados gerais de wearables de consumo.

Declarar a permissão

Para gravar detalhes do UDI na Conexão Saúde, declare a permissão WRITE_DEVICE_UDI no arquivo AndroidManifest.xml do app:

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

WRITE_DEVICE_UDI é uma permissão normal. Você precisa declará-la no manifesto, mas não precisa solicitá-la ao usuário no momento da execução. Ela é concedida automaticamente ao app no momento da instalação.

Escreva apenas a parte do identificador do dispositivo (DI)

Um UDI completo tem duas partes:

  • Identificador do dispositivo (UDI-DI): um identificador reconhecido globalmente atribuído a um modelo de dispositivo específico por uma agência emissora (por exemplo, GS1).
  • Identificador de produção (UDI-PI): atributos específicos da unidade, como números de série, números de lote, datas de fabricação ou datas de validade.

Para proteger a privacidade do usuário, preencha apenas a parte do UDI-DI do código na Conexão Saúde. Não inclua atributos de identificador de produção (como números de série ou de lote).

Exemplo de código

Observação:é possível definir o UDI ao criar uma instância de Device.

SDK do Jetpack

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

API Platform

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

Se você gravar dados com um UDI sem declarar a permissão WRITE_DEVICE_UDI, o Conexão Saúde vai gerar uma SecurityException no momento da gravação.

Usar o UDI para verificar a liberação do dispositivo

A Conexão Saúde serve como uma camada de transporte e não valida a autenticidade ou o status de registro do UDI.

Para leitores de dados, a presença de um UDI indica que os dados são provenientes de um dispositivo médico registrado. Os apps de leitura precisam consultar bancos de dados regulatórios, como o Banco de Dados Global de Identificação Exclusiva de Dispositivos (GUDID, na sigla em inglês) do FDA ou o EUDAMED da UE, para verificar as classificações de dispositivos, o status de autorização regulatória (por exemplo, Classe I, II ou III) ou o uso pretendido específico.

Snippets atualizados

Os guias do Conexão Saúde foram atualizados sempre que novos snippets são necessários para aderir aos novos requisitos de metadados. Para ver alguns exemplos, consulte a página Gravar dados.

Novos métodos de metadados

Não é mais possível instanciar metadados diretamente. Use um dos métodos de fábrica para receber uma nova instância de metadados. Os métodos de fábrica verificam se as informações do dispositivo são fornecidas quando um dispositivo ou sensor é usado para registrar os dados. Para dados inseridos manualmente, o fornecimento de informações do dispositivo permanece opcional. Cada função tem três variantes de assinatura:

  • 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

Para mais informações, consulte o Android Open Source Project.

Dados de teste

Use a Testing Library e MetadataTestHelper para simular valores de metadados esperados:

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

Isso simula o comportamento da implementação do Conexão Saúde, que preenche automaticamente esses valores durante a inserção do registro.

Para a biblioteca de testes, adicione esta dependência do SDK do Conexão Saúde ao arquivo build.gradle no nível do módulo:

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

Fazer upgrade da biblioteca

As principais etapas que você precisa realizar são:

  1. Faça upgrade da biblioteca para a versão 1.1.0-alpha12.

  2. Ao criar a biblioteca, erros de compilação serão gerados quando novos metadados forem necessários. Para resolver esses erros e concluir a migração, verifique se você fez as seguintes alterações:

    • É obrigatório especificar um método de gravação ao criar um Record. Para isso, use um dos métodos de fábrica fornecidos em Metadata, como Metadata.manualEntry() ou Metadata.activelyRecorded(device = Device(...)).
    • Para dados registrados por um dispositivo, é obrigatório especificar um tipo de dispositivo, como Device.TYPE_WATCH ou Device.TYPE_PHONE.
  3. Se o app gravar tipos de dispositivo estendidos, use FEATURE_EXTENTED_DEVICE_TYPES para evitar TYPE_UNKNOWN inesperados em dispositivos em que o recurso não está disponível.