Lire des données brutes

L'exemple suivant vous montre comment lire des données brutes dans le cadre du workflow commun.

Lire des données

Santé Connect permet aux applications de lire les données du datastore lorsqu'elles sont au premier plan et en arrière-plan :

  • Lecture au premier plan : vous pouvez normalement lire les données de Santé Connect lorsque votre application est au premier plan. Dans ce cas, vous pouvez envisager d'utiliser un service de premier plan pour exécuter cette opération si l'utilisateur ou le système place votre application en arrière-plan lors d'une opération de lecture.

  • Lectures en arrière-plan : en demandant une autorisation supplémentaire à l'utilisateur, vous pouvez lire les données une fois que l'utilisateur ou le système a placé votre application en arrière-plan. Consultez l'exemple de lecture en arrière-plan complet.

Le type de données Pas dans Santé Connect enregistre le nombre de pas qu'un utilisateur a effectués entre deux lectures. Le nombre de pas est une unité de mesure courante pour les plates-formes de santé, de remise en forme et de bien-être. Santé Connect facilite la lecture et l'écriture des données sur le nombre de pas.

Pour lire des enregistrements, créez une ReadRecordsRequest et fournissez-la lorsque vous appelez readRecords.

L'exemple suivant montre comment lire le nombre de pas d'un utilisateur au cours d'une certaine période. Pour obtenir un exemple détaillé avec SensorManager, consultez le guide sur les données Nombre de pas.

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

Vous pouvez également lire des données agrégées à l'aide de aggregate.

suspend fun readStepsByTimeRange(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant
) {
    try {
        val response = healthConnectClient.aggregate(
            AggregateRequest(
                metrics = setOf(StepsRecord.COUNT_TOTAL),
                timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
            )
        )
        // The result may be null if no data is available in the time range
        val stepCount = response[StepsRecord.COUNT_TOTAL]
    } catch (e: Exception) {
        // Run error handling here
    }
}

Exemple de lecture en arrière-plan

Pour lire les données en arrière-plan, déclarez l'autorisation suivante dans votre fichier manifeste :

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

L'exemple suivant montre comment lire le nombre de pas d'un utilisateur en arrière-plan au cours d'une certaine période à l'aide de 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
  ...
}

Le paramètre ReadRecordsRequest a une valeur par défaut pageSize de 1 000. Si le nombre d'enregistrements dans un seul readResponse dépasse le pageSize de la requête, vous devez parcourir toutes les pages de la réponse pour récupérer tous les enregistrements à l'aide de pageToken. Toutefois, veillez à ne pas dépasser les limites de débit.

Exemple de lecture de pageToken

Nous vous recommandons d'utiliser pageToken pour lire les enregistrements et récupérer toutes les données disponibles pour la période demandée.

L'exemple suivant montre comment lire tous les enregistrements jusqu'à ce que tous les jetons de page aient été épuisés :

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
}

Pour en savoir plus sur les bonnes pratiques à suivre lors de la lecture d'ensembles de données volumineux, consultez Planifier pour éviter la limitation du débit.

Lire les données déjà écrites

Si une application a déjà écrit des enregistrements sur Santé Connect, elle peut lire les données historiques. Cela s'applique aux scénarios dans lesquels l'application doit se resynchroniser avec Santé Connect après que l'utilisateur l'a réinstallée.

Certaines restrictions de lecture s'appliquent :

  • Pour Android 14 ou version ultérieure

    • Aucune limite historique pour une application qui lit ses propres données.
    • Limite de 30 jours pour une application qui lit d'autres données.
  • Pour Android 13 et versions antérieures

    • Limite de 30 jours pour la lecture des données par l'application.

Pour supprimer les restrictions, vous pouvez demander une autorisation de lecture.

Pour lire les données historiques, vous devez indiquer le nom du package en tant qu'objet DataOrigin dans le paramètre dataOriginFilter de votre ReadRecordsRequest.

L'exemple suivant montre comment indiquer un nom de package lors de la lecture des enregistrements de fréquence cardiaque :

try {
    val response =  healthConnectClient.readRecords(
        ReadRecordsRequest(
            recordType = HeartRateRecord::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
}

Lire les données de plus de 30 jours

Par défaut, toutes les applications peuvent lire les données de Santé Connect remontant jusqu'à 30 jours avant la date d'octroi de la première autorisation.

Si vous devez étendre les autorisations de lecture au-delà des restrictions par défaut, demandez le PERMISSION_READ_HEALTH_DATA_HISTORY. Sinon, sans cette autorisation, toute tentative de lecture d'enregistrements datant de plus de 30 jours génère une erreur.

Historique des autorisations pour une application supprimée

Si un utilisateur supprime votre application, toutes les autorisations, y compris l'autorisation d'historique, sont révoquées. Si l'utilisateur réinstalle votre application et accorde de nouveau l'autorisation, les mêmes restrictions par défaut s'appliquent, et votre application peut lire les données de Santé Connect remontant jusqu'à 30 jours avant cette nouvelle date.

Par exemple, supposons que l'utilisateur supprime votre application le 10 mai 2023, puis la réinstalle le 15 mai 2023 et accorde des autorisations de lecture. Par défaut, votre application pourra lire les données remontant au 15 avril 2023.