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 au cas où l'utilisateur ou le système placerait 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 des données sur le nombre de pas.

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
    }
}

Exemple de lecture en arrière-plan

Pour lire des 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 les données sur le nombre de pas en arrière-plan pour un utilisateur 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
  ...
}

La valeur par défaut de pageSize pour le paramètre ReadRecordsRequest est 1 000. Si le nombre d'enregistrements dans un seul readResponse dépasse le pageSize de la requête, vous devez itérer sur toutes les pages de la réponse pour récupérer tous les enregistrements à l'aide de pageToken. Toutefois, veillez à éviter les problèmes de limitation de débit.

Exemple de lecture de pageToken

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

L'exemple suivant montre comment lire tous les enregistrements jusqu'à ce que tous les jetons de page soient é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 découvrir les bonnes pratiques à adopter lors de la lecture de grands ensembles de données, consultez la section Planifier pour éviter la limitation de 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 lisant 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 de données par l'application.

Pour supprimer ces restrictions, demandez 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 du nombre de pas :

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
}

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à de l'une des restrictions par défaut, demandez PERMISSION_READ_HEALTH_DATA_HISTORY. Sinon, sans cette autorisation, une tentative de lecture d'enregistrements datant de plus de 30 jours génère une erreur.

Historique des autorisations d'une application supprimée

Si un utilisateur supprime votre application, toutes les autorisations, y compris l'autorisation d'accéder à l'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. Votre application pourra donc lire les données remontant au 15 avril 2023.