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. |
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
}
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:
activelyRecordedfun activelyRecorded(device: Device): Metadata.fun activelyRecorded(clientRecordId: String, clientRecordVersion: Long = 0, device: Device): Metadatafun activelyRecordedWithId(id: String, device: Device): Metadata
autoRecordedfun autoRecorded(device: Device): Metadatafun autoRecorded(clientRecordId: String, clientRecordVersion: Long = 0, device: Device): Metadatafun autoRecordedWithId(id: String, device: Device): Metadata
manualEntryfun manualEntry(device: Device? = null): Metadatafun manualEntry(clientRecordId: String, clientRecordVersion: Long = 0, device: Device? = null): Metadatafun manualEntryWithId(id: String, device: Device? = null): Metadata
unknownRecordingMethodfun unknownRecordingMethod(device: Device? = null): Metadatafun unknownRecordingMethod(clientRecordId: String, clientRecordVersion: Long = 0, device: Device? = null): Metadatafun 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:
Faça upgrade da biblioteca para a versão 1.1.0-alpha12.
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 emMetadata, comoMetadata.manualEntry()ouMetadata.activelyRecorded(device = Device(...)). - Para dados registrados por um dispositivo, é obrigatório especificar um tipo de dispositivo,
como
Device.TYPE_WATCHouDevice.TYPE_PHONE.
- É obrigatório especificar um método de gravação ao criar um
Se o app gravar tipos de dispositivo estendidos, use
FEATURE_EXTENTED_DEVICE_TYPESpara evitarTYPE_UNKNOWNinesperados em dispositivos em que o recurso não está disponível.