Requisitos de los metadatos

Esta guía es compatible con la versión 1.2.0-alpha05 y versiones posteriores de Health Connect.

Se realizaron cambios en los metadatos de Health Connect para los desarrolladores que se actualicen a la versión 1.1.0-alpha12 o una posterior.

Información de la biblioteca

El ID del artefacto del complemento de Android para Gradle de Google Maven identifica la biblioteca de Health Connect a la que te deberás actualizar. Agrega esta dependencia del SDK de Health Connect a tu archivo build.gradle del módulo:

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

Cambios de metadatos

Se introdujeron dos cambios en los metadatos del SDK de Jetpack de Health Connect a partir de la versión 1.1.0-alpha12 para ayudar a verificar que existan metadatos útiles adicionales en el ecosistema. Si metadata no se incluye en el constructor Record, es posible que veas un error de Constructor interno.

Cómo especificar el método de registro

Debes especificar los detalles de los metadatos cada vez que se cree una instancia de un objeto de tipo Record().

Cuando escribas datos en Health Connect, debes especificar uno de los cuatro métodos de registro con uno de los métodos de fábrica correspondientes para crear una instancia de Metadata:

Método de registro Descripción
RECORDING_METHOD_UNKNOWN No se puede verificar el método de registro.
RECORDING_METHOD_MANUAL_ENTRY El usuario ingresó los datos.
RECORDING_METHOD_AUTOMATICALLY_RECORDED Un dispositivo o sensor registró los datos.
RECORDING_METHOD_ACTIVELY_RECORDED El usuario inició o finalizó la sesión de registro en un dispositivo.

Por ejemplo:

 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

Debes especificar un tipo de dispositivo para todos los datos que se registran de forma automática y activa. Para obtener más detalles, consulta la clase Device en la documentación de Jetpack. Los tipos de dispositivos actuales incluyen los siguientes:

Tipo de dispositivo Descripción
TYPE_UNKNOWN El tipo de dispositivo es desconocido.
TYPE_WATCH El tipo de dispositivo es un reloj.
TYPE_PHONE El tipo de dispositivo es un teléfono.
TYPE_SCALE El tipo de dispositivo es una báscula.
TYPE_RING El tipo de dispositivo es un anillo.
TYPE_HEAD_MOUNTED El tipo de dispositivo es un dispositivo para la cabeza.
TYPE_FITNESS_BAND El tipo de dispositivo es una correa de fitness.
TYPE_CHEST_STRAP El tipo de dispositivo es una correa para el pecho.
TYPE_SMART_DISPLAY El tipo de dispositivo es una pantalla inteligente.

Algunos valores de Device.type solo están disponibles en versiones posteriores de Health Connect. Cuando la función de tipos de dispositivos extendidos no está disponible, estos tipos se tratan como Device.TYPE_UNKNOWN.

Tipos de dispositivos extendidos Descripción
TYPE_CONSUMER_MEDICAL_DEVICE El tipo de dispositivo es un dispositivo médico.
TYPE_GLASSES El tipo de dispositivo es un par de lentes inteligentes.
TYPE_HEARABLE El tipo de dispositivo es un dispositivo de audio.
TYPE_FITNESS_MACHINE El tipo de dispositivo es una máquina estacionaria.
TYPE_FITNESS_EQUIPMENT El tipo de dispositivo es equipo de fitness.
TYPE_PORTABLE_COMPUTER El tipo de dispositivo es una computadora portátil.
TYPE_METER El tipo de dispositivo es un medidor.
Para determinar si el dispositivo de un usuario admite tipos de dispositivos extendidos en Health Connect, verifica la disponibilidad de FEATURE_EXTENDED_DEVICE_TYPES en el cliente:

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

  // Feature is available
} else {
  // Feature isn't available
}
Consulta Cómo verificar la disponibilidad de funciones para obtener más información.

Por ejemplo:

 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 único del dispositivo (UDI)

En el caso de Health Connect en Android 17 (nivel de API 37.1) o la extensión U 23 o versiones posteriores, la clase Device incluye compatibilidad con el identificador único del dispositivo (UDI). Asociar los detalles del modelo de UDI registrado de un dispositivo médico con tus registros escritos permite que las aplicaciones posteriores (como las plataformas de telemedicina o los portales clínicos) identifiquen las lecturas de grado clínico y las distingan de los datos generales de los wearables para el consumidor.

Declara el permiso

Para escribir detalles del UDI en Health Connect, debes declarar el permiso WRITE_DEVICE_UDI en el archivo AndroidManifest.xml de tu app:

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

Ten en cuenta que WRITE_DEVICE_UDI es un permiso normal. Debes declararlo en tu manifiesto, pero no es necesario que lo solicites al usuario en el tiempo de ejecución. Se otorga automáticamente a tu app en el momento de la instalación.

Escribe solo la parte del identificador del dispositivo (DI).

Un UDI completo contiene dos partes:

  • Identificador del dispositivo (UDI-DI): Es un identificador reconocido a nivel mundial que una agencia emisora (por ejemplo, GS1) asigna a un modelo de dispositivo específico.
  • Identificador de producción (UDI-PI): Son los atributos específicos de la unidad, como números de serie, números de lote, fechas de fabricación o fechas de vencimiento.

Para proteger la privacidad del usuario, solo completa la parte del UDI-DI del código en Health Connect. No incluyas ningún atributo de identificador de producción (como números de serie o números de lote).

Ejemplo de código

Nota: Puedes establecer el UDI cuando construyes una instancia de Device.

SDK de Jetpack

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

API de la 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()

Si escribes datos con un UDI sin declarar el permiso de WRITE_DEVICE_UDI, Health Connect arroja un SecurityException en el momento de la escritura.

Cómo usar el UDI para verificar la autorización del dispositivo

Health Connect funciona como una capa de transporte y no valida la autenticidad ni el estado de registro del UDI.

Para los lectores de datos, la presencia de un UDI indica que los datos provienen de un dispositivo médico registrado. Las apps de lectura deben consultar bases de datos regulatorias, como la Base de datos global de identificación única de dispositivos (GUDID) de la FDA o EUDAMED de la UE, para verificar las clasificaciones de dispositivos, el estado de aprobación regulatoria (por ejemplo, Clase I, II o III) o el uso previsto específico.

Se actualizaron los fragmentos

Se actualizaron las guías de Health Connect en todos los casos en que se necesitaban fragmentos nuevos para cumplir con los nuevos requisitos de metadatos. Para ver algunos ejemplos, consulta la página sobre cómo escribir datos.

Nuevos métodos de metadatos

Ya no se pueden crear instancias de metadatos directamente, por lo que debes usar uno de los métodos de fábrica para obtener una instancia nueva de metadatos. Los métodos de fábrica verifican que se proporcione información del dispositivo cuando se usó un dispositivo o sensor para registrar los datos. En el caso de los datos ingresados manualmente, proporcionar información del dispositivo sigue siendo opcional. Cada función tiene tres variantes de firma:

  • 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 obtener más información, consulta el Proyecto de código abierto de Android.

Datos de prueba

Usa la biblioteca de pruebas y MetadataTestHelper para simular los valores de metadatos esperados:

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

Esto simula el comportamiento de la implementación de Health Connect, que propaga automáticamente estos valores durante la inserción de registros.

Para la biblioteca de pruebas, debes agregar esta dependencia del SDK de Health Connect a tu archivo build.gradle del módulo:

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

Actualiza la biblioteca

Estos son los pasos principales que debes seguir:

  1. Actualiza tu biblioteca a la versión 1.1.0-alpha12.

  2. Cuando compiles la biblioteca, se arrojarán errores de compilación en los lugares donde se necesiten metadatos nuevos. Para resolver estos errores y completar la migración, verifica que realices los siguientes cambios:

    • Es obligatorio especificar un método de registro cuando se construye un Record. Para ello, usa uno de los métodos de fábrica proporcionados en Metadata, como Metadata.manualEntry() o Metadata.activelyRecorded(device = Device(...)).
    • En el caso de los datos registrados por un dispositivo, es obligatorio especificar un tipo de dispositivo, como Device.TYPE_WATCH o Device.TYPE_PHONE.
  3. Si tu app escribe tipos de dispositivos extendidos, colócalos detrás de FEATURE_EXTENTED_DEVICE_TYPES para evitar TYPE_UNKNOWN inesperados en dispositivos en los que la función no está disponible.