Cómo leer datos sin procesar

En el siguiente ejemplo, se muestra cómo leer datos sin procesar como parte de un flujo de trabajo común.

Lee datos

Health Connect permite que las apps lean datos del almacén de datos cuando estas se encuentran en primer y segundo plano:

  • Lecturas en primer plano: Por lo general, puedes leer datos de Health Connect cuando tu app está en primer plano. En estos casos, puedes considerar usar un servicio en primer plano para ejecutar esta operación en caso de que el usuario o el sistema coloquen tu app en segundo plano durante una operación de lectura.

  • Lecturas en segundo plano: Si solicitas un permiso adicional al usuario, puedes leer datos después de que el usuario o el sistema coloquen tu app en segundo plano. Consulta el ejemplo completo de lectura en segundo plano.

El tipo de datos de Pasos en Health Connect captura la cantidad de pasos que dio un usuario entre cada medición. El recuento de pasos representa una medición común en todas las plataformas de salud, actividad física y bienestar. Health Connect facilita la lectura y la escritura de los datos del recuento de pasos.

Para leer registros, crea un ReadRecordsRequest e infórmalo cuando llames a readRecords.

En el siguiente ejemplo, se muestra cómo leer los datos del recuento de pasos para un usuario en un período determinado. Para ver un ejemplo extendido con SensorManager, consulta la guía de datos de recuento de pasos.

suspend fun readStepsByTimeRange(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant
) {
    try {
        val response = healthConnectClient.readRecords(
            ReadRecordsRequest(
                StepsRecord::class,
                timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
            )
        )
        for (stepRecord in response.records) {
            // Process each step record
        }
    } catch (e: Exception) {
        // Run error handling here
    }
}

Ejemplo de lectura en segundo plano

Para leer datos en segundo plano, declara el siguiente permiso en tu archivo de manifiesto:

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

En el siguiente ejemplo, se muestra cómo leer los datos del recuento de pasos en segundo plano para un usuario dentro de un período determinado con WorkManager:

class ScheduleWorker(private val appContext: Context, workerParams: WorkerParameters):
    CoroutineWorker(appContext, workerParams) {

    override suspend fun doWork(): Result {
        // Read data and process it.
        ...

        // Return success indicating successful data retrieval
        return Result.success()
    }
}

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

    // Check if necessary permission is granted
    val grantedPermissions = healthConnectClient.permissionController.getGrantedPermissions()

    if (PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND !in grantedPermissions) {
        // Perform read in foreground
        ...
    } else {
        // Schedule the periodic work request in background
        val periodicWorkRequest = PeriodicWorkRequestBuilder<ScheduleWorker>(1, TimeUnit.HOURS)
            .build()

        WorkManager.getInstance(context).enqueueUniquePeriodicWork(
            "read_health_connect",
            ExistingPeriodicWorkPolicy.KEEP,
            periodicWorkRequest
        )
    }
} else {
  // Background reading is not available, perform read in foreground
  ...
}

Lectura de datos pasados

Si una app escribió registros en Health Connect anteriormente, es posible que la app vuelva a leerlos sin requerir un permiso de lectura para esos registros específicos. Esto se aplica a situaciones en las que la app necesita volver a sincronizarse con Health Connect cuando el usuario la reinstala.

Para leer los datos en esta situación, debes indicar el nombre del paquete como un objeto DataOrigin en el parámetro dataOriginFilter de tu ReadRecordsRequest.

En el siguiente ejemplo, se muestra cómo indicar un nombre de paquete cuando se leen los registros de Pasos:

try {
    val response =  healthConnectClient.readRecords(
        ReadRecordsRequest(
            recordType = StepsRecord::class,
            timeRangeFilter = TimeRangeFilter.between(startTime, endTime),
            dataOriginFilter = setOf(DataOrigin("com.my.package.name"))
        )
    )
    for (record in response.records) {
        // Process each record
    }
} catch (e: Exception) {
    // Run error handling here
}

Leer restricciones

De forma predeterminada, tu app puede leer datos hasta 30 días con cualquier permiso otorgado. Con el permiso PERMISSION_READ_HEALTH_DATA_HISTORY, tu app puede leer datos de más de 30 días.

Restricción de 30 días

Health Connect puede leer datos hasta 30 días antes del otorgamiento de cualquier permiso.

Sin embargo, si un usuario borra tu app, se perderá el historial de permisos. Si el usuario vuelve a instalar tu app y le otorga permiso de nuevo, la app podrá leer datos de Health Connect hasta 30 días antes de esa fecha nueva.

Ejemplo de 30 días

Si un usuario otorgó permiso de lectura a tu aplicación por primera vez el 30 de marzo de 2023, los datos más antiguos que podría leer tu app serán del 28 de febrero de 2023 en adelante.

Luego, el 10 de mayo de 2023, el usuario borra tu app. El usuario decide volver a instalarla el 15 de mayo de 2023 y otorgar permiso de lectura. Ahora, la fecha más antigua de la que puede leer datos es el 15 de abril de 2023.

Lee datos de más de 30 días

Si deseas leer datos con más de 30 días de antigüedad, debes usar el permiso PERMISSION_READ_HEALTH_DATA_HISTORY. Sin este permiso, intentar leer un solo registro de más de 30 días genera un error. Tampoco puedes leer datos de más de 30 días con una de las solicitudes de período.