Requisitos de metadados

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

Há mudanças nos metadados da 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 Google Maven identifica a biblioteca do Conexão Saúde que precisa ser atualizada. 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ê receba um erro Interno do construtor.

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, especifique 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 foi 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 gravou os dados.
RECORDING_METHOD_ACTIVELY_RECORDED O usuário iniciou o começo ou o fim da 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 gravados automaticamente e de forma ativa. Para mais detalhes, consulte a classe Device na documentação do Jetpack. Os tipos de dispositivos 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 escala.
TYPE_RING O tipo de dispositivo é um toque.
TYPE_HEAD_MOUNTED O tipo de dispositivo é um dispositivo montado na cabeça.
TYPE_FITNESS_BAND O tipo de dispositivo é uma pulseira de fitness.
TYPE_CHEST_STRAP O tipo de dispositivo é uma cinta torácica.
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 da 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 ou óculos de proteção.
TYPE_HEARABLE O tipo de dispositivo é um aparelho auditivo.
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 dispositivos 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
}
Saiba mais em Verificar a disponibilidade de recursos.

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 a Conexão Saúde no Android 17 (nível 37.1 da API) ou U extension 23 ou mais recente, a classe Device inclui suporte ao identificador único de dispositivo (UDI, na sigla em inglês). Ao associar os detalhes do modelo de UDI registrado de um dispositivo médico aos seus registros escritos, os aplicativos downstream (como plataformas de telessaúde ou portais clínicos) podem identificar leituras de nível clínico e diferenciá-las dos dados gerais de dispositivos vestíveis para consumidores.

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 declarar isso no manifesto, mas não precisa pedir ao usuário no ambiente de 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 UDI-DI do código no 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 construir uma instância 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 da plataforma

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, a Conexão Saúde vai gerar um SecurityException no momento da gravação.

Use 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 originados de um dispositivo médico registrado. Os apps de leitura precisam consultar bancos de dados regulatórios, como o Global Unique Device Identification Database (GUDID) da FDA ou o EUDAMED da UE, para verificar classificações de dispositivos, status de aprovação regulatória (por exemplo, classe I, II ou III) ou uso específico pretendido.

Snippets atualizados

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

Novos métodos de metadados

Os metadados não podem mais ser instanciados 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 foi usado para registrar os dados. Para dados inseridos manualmente, fornecer informações do dispositivo continua sendo 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 de registros.

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 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 mudanças:

    • É obrigatório especificar um método de gravação ao construir um Record. Isso é feito usando um dos métodos de fábrica fornecidos em Metadata, como Metadata.manualEntry() ou Metadata.activelyRecorded(device = Device(...)).
    • Para dados gravados 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 dispositivos estendidos, coloque-os atrás de FEATURE_EXTENTED_DEVICE_TYPES para evitar TYPE_UNKNOWN inesperados em dispositivos em que o recurso não está disponível.