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 de un usuario en un período determinado. Para ver un ejemplo extendido con SensorManager
, consulta la guía de datos del registro 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 de un usuario en 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
...
}
El parámetro ReadRecordsRequest
tiene un valor predeterminado de pageSize
de 1,000.
Si la cantidad de registros en un solo readResponse
supera el pageSize
de la solicitud, debes iterar por todas las páginas de la respuesta para recuperar todos los registros con pageToken
.
Sin embargo, ten cuidado para evitar problemas de limitación de frecuencia.
Ejemplo de lectura de pageToken
Se recomienda usar pageToken
para leer registros y recuperar todos los datos disponibles del período solicitado.
En el siguiente ejemplo, se muestra cómo leer todos los registros hasta que se agoten todos los tokens de página:
val type = HeartRateRecord::class
val endTime = Instant.now()
val startTime = endTime.minus(Duration.ofDays(7))
try {
var pageToken: String? = null
do {
val readResponse =
healthConnectClient.readRecords(
ReadRecordsRequest(
recordType = type,
timeRangeFilter = TimeRangeFilter.between(
startTime,
endTime
),
pageToken = pageToken
)
)
val records = readResponse.records
// Do something with records
pageToken = readResponse.pageToken
} while (pageToken != null)
} catch (quotaError: IllegalStateException) {
// Backoff
}
Para obtener información sobre las prácticas recomendadas para leer conjuntos de datos grandes, consulta Planifica para evitar el límite de frecuencia.
Lectura de datos pasados
Si una app escribió registros en Health Connect anteriormente, es posible que la app lea datos históricos. Esto se aplica a situaciones en las que la app necesita volver a sincronizarse con Health Connect cuando el usuario la reinstala.
Se aplican algunas restricciones de lectura:
Para Android 14 y versiones posteriores
- No hay límite histórico para que una app lea sus propios datos.
- Límite de 30 días para que una app lea otros datos.
Para Android 13 y versiones anteriores
- Límite de 30 días para que las apps lean datos.
Para quitar las restricciones, solicita un permiso de lectura.
Para leer los datos históricos, 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
}
Lee datos de más de 30 días
De forma predeterminada, todas las aplicaciones pueden leer datos de Health Connect hasta 30 días antes del otorgamiento de cualquier permiso.
Si necesitas extender los permisos de lectura más allá de cualquiera de las restricciones predeterminadas, solicita el PERMISSION_READ_HEALTH_DATA_HISTORY
.
De lo contrario, sin este permiso, se producirá un error si intentas leer registros de más de 30 días.
Historial de permisos de una app borrada
Si un usuario borra tu app, se revocarán todos los permisos, incluido el permiso de historial. Si el usuario vuelve a instalar tu app y le otorga permiso de nuevo, se aplican las mismas restricciones predeterminadas, y tu app puede leer datos de Health Connect hasta 30 días antes de esa fecha nueva.
Por ejemplo, supongamos que el usuario borra tu app el 10 de mayo de 2023, la reinstala el 15 de mayo de 2023 y otorga permisos de lectura. Ahora, la fecha más antigua de la que puede leer datos es el 15 de abril de 2023.