Ce guide explique comment écrire ou mettre à jour des données dans Santé Connect.
Configurer la structure des données
Avant d'écrire des données, nous devons configurer les enregistrements. Pour plus de 50 types de données, chacun présente sa propre structure. Consultez la documentation de référence de Jetpack pour en savoir plus sur les types de données disponibles.
Enregistrements de base
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.
L'exemple suivant montre comment définir les données relatives au nombre de pas :
val stepsRecord = StepsRecord(
count = 120,
startTime = START_TIME,
endTime = END_TIME,
startZoneOffset = START_ZONE_OFFSET,
endZoneOffset = END_ZONE_OFFSET
)
Enregistrements avec unités de mesure
Pour plus de précision, Santé Connect peut stocker les valeurs avec leur unité de mesure. Par exemple, le type de données Nutrition est vaste et complet. Il comprend une grande variété de champs de nutriments facultatifs, tels que la quantité totale de glucides ou les vitamines. Chaque point de données représente les nutriments qui ont pu être consommés dans le cadre d'un repas ou d'un aliment.
Dans ce type de données, tous les nutriments sont représentés par des unités de masse (Mass
), alors que l'energy
est représentée en unité d'Energy
.
L'exemple suivant montre comment définir des données nutritionnelles pour un utilisateur qui a mangé une banane :
val banana = NutritionRecord(
name = "banana",
energy = 105.0.kilocalories,
dietaryFiber = 3.1.grams,
potassium = 0.422.grams,
totalCarbohydrate = 27.0.grams,
totalFat = 0.4.grams,
saturatedFat = 0.1.grams,
sodium = 0.001.grams,
sugar = 14.0.grams,
vitaminB6 = 0.0005.grams,
vitaminC = 0.0103.grams,
startTime = START_TIME,
endTime = END_TIME,
startZoneOffset = START_ZONE_OFFSET,
endZoneOffset = END_ZONE_OFFSET
)
Enregistrements avec données séquentielles
Santé Connect peut stocker une liste de données séquentielles. Le type de données Fréquence cardiaque en est un bon exemple. Il capture une série d'échantillons de pulsation détectés entre les lectures.
Dans ce type de données, le paramètre samples
est représenté par une liste d'échantillons de la fréquence cardiaque. Chaque exemple contient une valeur beatsPerMinute
et une valeur time
.
L'exemple suivant montre comment définir des données séquentielles pour la fréquence cardiaque :
val heartRateRecord = HeartRateRecord(
startTime = START_TIME,
startZoneOffset = START_ZONE_OFFSET,
endTime = END_TIME,
endZoneOffset = END_ZONE_OFFSET,
// records 10 arbitrary data, to replace with actual data
samples = List(10) { index ->
HeartRateRecord.Sample(
time = START_TIME + Duration.ofSeconds(index.toLong()),
beatsPerMinute = 100 + index.toLong(),
)
}
)
Écrire des données
L'un des workflows courants de Santé Connect consiste à écrire des données. Pour ajouter des enregistrements, utilisez insertRecords
.
L'exemple suivant montre comment écrire des données pour insérer le nombre de pas :
suspend fun insertSteps(healthConnectClient: HealthConnectClient) {
try {
val stepsRecord = StepsRecord(
count = 120,
startTime = START_TIME,
endTime = END_TIME,
startZoneOffset = START_ZONE_OFFSET,
endZoneOffset = END_ZONE_OFFSET
)
healthConnectClient.insertRecords(listOf(stepsRecord))
} catch (e: Exception) {
// Run error handling here
}
}
Mettre à jour des données
Si vous devez modifier un ou plusieurs enregistrements, en particulier lorsque vous devez synchroniser le datastore de votre application avec les données de Santé Connect, vous pouvez les mettre à jour. Il existe deux façons de mettre à jour des données existantes en fonction de l'identifiant utilisé pour rechercher les enregistrements.
Métadonnées
Il est utile d'examiner d'abord la classe Metadata
, car cela est nécessaire pour mettre à jour les données. Lors de la création, chaque Record
dans Santé Connect comporte un champ metadata
. Les propriétés suivantes sont pertinentes pour la synchronisation :
Propriétés | Description |
---|---|
id
|
Chaque Record dans Santé Connect a une valeur id unique.Santé Connect la renseigne automatiquement lorsque vous insérez un nouvel enregistrement. |
lastModifiedTime
|
Chaque Record conserve la date de sa dernière modification.Santé Connect renseigne automatiquement cette information. |
clientRecordId
|
Chaque Record peut être associé à un identifiant unique qui servira de référence dans le datastore de votre application.
Votre application fournit cette valeur. |
clientRecordVersion
|
Lorsqu'un enregistrement est associé à un clientRecordId , vous pouvez utiliser clientRecordVersion pour permettre aux données de rester synchronisées avec la version du datastore de votre application.Votre application fournit cette valeur. |
Mettre à jour les données via un identifiant d'enregistrement
Pour mettre à jour les données, préparez d'abord les enregistrements nécessaires. Si nécessaire, modifiez les enregistrements. Appelez ensuite updateRecords
pour effectuer les modifications.
L'exemple suivant montre comment mettre à jour des données. À cette fin, les valeurs de décalage de zone de chaque enregistrement sont définies sur PST.
suspend fun updateSteps(
healthConnectClient: HealthConnectClient,
prevRecordStartTime: Instant,
prevRecordEndTime: Instant
) {
try {
val request = healthConnectClient.readRecords(
ReadRecordsRequest(
recordType = StepsRecord::class,
timeRangeFilter = TimeRangeFilter.between(
prevRecordStartTime,
prevRecordEndTime
)
)
)
val newStepsRecords = arrayListOf<StepsRecord>()
for (record in request.records) {
// Adjusted both offset values to reflect changes
val sr = StepsRecord(
count = record.count,
startTime = record.startTime,
startZoneOffset = record.startTime.atZone(ZoneId.of("PST")).offset,
endTime = record.endTime,
endZoneOffset = record.endTime.atZone(ZoneId.of("PST")).offset,
metadata = record.metadata
)
newStepsRecords.add(sr)
}
client.updateRecords(newStepsRecords)
} catch (e: Exception) {
// Run error handling here
}
}
Insérer les données mises à jour via l'identifiant de l'enregistrement client
Si vous utilisez les valeurs facultatives d'identifiant et de version de l'enregistrement client, nous vous recommandons d'utiliser insertRecords
au lieu de updateRecords
.
La fonction insertRecords
peut insérer les données mises à jour.
Si les données existent dans Santé Connect en fonction de l'ensemble donné d'identifiants d'enregistrements client, elles sont écrasées. Sinon, elles sont écrites en tant que nouvelles données.
Ce scénario est utile lorsque vous devez synchroniser les données du datastore de votre application avec Santé Connect.
L'exemple suivant montre comment effectuer une opération d'insertion des données mises à jour à partir du datastore de l'application :
suspend fun pullStepsFromDatastore() : ArrayList<StepsRecord> {
val appStepsRecords = arrayListOf<StepsRecord>()
// Pull data from app datastore
// ...
// Make changes to data if necessary
// ...
// Store data in appStepsRecords
// ...
var sr = StepsRecord(
// Assign parameters for this record
metadata = Metadata(
clientRecordId = cid
)
)
appStepsRecords.add(sr)
// ...
return appStepsRecords
}
suspend fun upsertSteps(
healthConnectClient: HealthConnectClient,
newStepsRecords: ArrayList<StepsRecord>
) {
try {
healthConnectClient.insertRecords(newStepsRecords)
} catch (e: Exception) {
// Run error handling here
}
}
Vous pourrez ensuite appeler ces fonctions dans votre thread principal.
upsertSteps(healthConnectClient, pullStepsFromDatastore())
Vérification des valeurs dans la version de l'enregistrement client
Si votre processus d'insertion des données mises à jour inclut la version de l'enregistrement client, Santé Connect effectue des vérifications des valeurs clientRecordVersion
. Si la version des données insérées est ultérieure à celle des données existantes, l'insertion des données se produit. Sinon, le processus ignore la modification, et la valeur reste la même.
Pour inclure la gestion des versions dans vos données, vous devez fournir à Metadata.clientRecordVersion
une valeur Long
basée sur votre logique de gestion des versions.
val sr = StepsRecord(
count = count,
startTime = startTime,
startZoneOffset = startZoneOffset,
endTime = endTime,
endZoneOffset = endZoneOffset,
metadata = Metadata(
clientRecordId = cid,
clientRecordVersion = version
)
)
Les insertions n'incrémentent pas automatiquement la version
à chaque modification, ce qui évite tout écrasement inattendu des données. Vous devez donc lui attribuer manuellement une valeur plus élevée.
Bonnes pratiques pour l'écriture de données
Les applications ne doivent écrire dans Santé Connect que des données dont elles sont la source.
Si les données ont été importées depuis une autre application, la responsabilité d'écriture dans Santé Connect incombe à cette application.
Il est également conseillé d'implémenter une logique qui gère les exceptions d'écriture (par exemple, les données qui se trouvent en dehors des limites ou les erreurs système internes). Vous pouvez appliquer vos stratégies d'intervalle entre les tentatives et de nouvelles tentatives au niveau d'un mécanisme de planification des tâches. Si l'écriture sur Santé Connect échoue, assurez-vous que votre application peut passer outre ce point d'exportation. N'oubliez pas de consigner et de signaler les erreurs pour faciliter le diagnostic.
Lorsque vous suivez les données, quelques suggestions peuvent vous aider en fonction de la manière dont votre application écrit les données.
Suivi passif
Cela inclut les applications qui effectuent un suivi passif de la condition physique ou de la santé, comme l'enregistrement continu d'un nombre de pas ou d'une fréquence cardiaque.
Votre application doit écrire régulièrement des données dans Santé Connect comme suit :
- Lors de chaque synchronisation, n'écrivez que les nouvelles données et les données mises à jour qui ont été modifiées depuis le la dernière synchronisation.
- Limitez les requêtes à 1 000 enregistrements par requête d'écriture.
- Utilisez
WorkManager
pour planifier les tâches périodiques en arrière-plan, d'une durée minimale de 15 minutes. Permettez l'exécution des tâches uniquement lorsque l'appareil est inactif et qu'il n'est pas à court de batterie.
val constraints = Constraints.Builder() .requiresBatteryNotLow() .requiresDeviceIdle(true) .build() val writeDataWork = PeriodicWorkRequestBuilder<WriteDataToHealthConnectWorker>( 15, TimeUnit.MINUTES, 5, TimeUnit.MINUTES ) .setConstraints(constraints) .build()
Suivi actif
Cela inclut les applications qui effectuent le suivi des événements comme les entraînements et le sommeil, ou les entrées manuelles des utilisateurs, comme la nutrition. Ces enregistrements sont créés lorsque l'application est exécutée au premier plan ou sont des événements occasionnels qui se produisent tout au plus quelques fois par jour.
Assurez-vous que votre application n'entraîne pas l'exécution continue de Santé Connect pendant toute la durée de l'événement.
Les données doivent être écrites dans Santé Connect de l'une des deux manières suivantes :
- Synchronisez les données avec Santé Connect une fois l'événement terminé (par exemple, lorsque l'utilisateur met fin à un entraînement dont le suivi était effectué).
- Planifiez une tâche ponctuelle à l'aide de
WorkManager
pour synchroniser les données ultérieurement.
Bonnes pratiques concernant la précision et la fréquence des écritures
Lorsque vous écrivez des données dans Santé Connect, utilisez une résolution appropriée. Avec les la résolution appropriée permet de réduire la charge de stockage, tout en maintenant cohérentes et précises. La résolution de données englobe deux éléments:
- Fréquence des écritures: la fréquence à laquelle votre application transfère de nouvelles données vers Santé Connect. Par exemple, écrivez de nouvelles données toutes les 15 minutes.
- Précision des données écrites: la fréquence à laquelle les données transmises ont été échantillonnée. Par exemple, écrivez des échantillons de fréquence cardiaque toutes les 5 s. Tous les types de données nécessite le même taux d'échantillonnage. Mettre à jour le nombre de pas ne présente que peu d'avantages. de données par seconde, au lieu d'une cadence moins fréquente (par exemple, toutes les 60 secondes. Toutefois, des taux d'échantillonnage plus élevés peuvent donner aux utilisateurs un aperçu plus détaillé et un regard précis sur leurs données de santé et de remise en forme. Fréquences d'échantillonnage doit trouver le bon équilibre entre le niveau de détail et les performances.
Accès en écriture aux données surveillées tout au long de la journée
Pour les données collectées en continu, telles que les étapes, votre application doit d'écrire à Santé Connect au moins toutes les 15 minutes dans la journée.
Type de données |
Unité |
Disponibilité |
Exemple |
Étapes |
pas |
Toutes les minutes |
23:14 - 23:15 - 5 pas 23:16 - 23:17 - 22 pas 23:17 - 23:18 - 8 pas |
Rythme de pas |
pas/min |
Toutes les minutes |
23:14-23:15-17:00 23:16 - 23:17 - 22 ppm 23:17 – 23:18 – 20:00 |
Poussées de fauteuil roulant |
pousse |
Toutes les minutes |
23:14 - 23:15 : 5 poussées 23:16 - 23:17 : 22 poussées 23:17 - 23:18 : 8 poussées |
ActiveCalories brûlées |
Calories |
Toutes les 15 minutes |
23:15 - 23:30 - 2 calories 23:30 - 23:45 - 25 calories 23:45 - 00:00 - 5 calories |
TotalCaloriesBrûlées |
Calories |
Toutes les 15 minutes |
23:15 - 23:30 - 16 calories 23:30 - 23:45 - 16 calories 23:45 - 00:00 - 16 calories |
Distance |
km/min |
Toutes les minutes |
23:14-23:15 : 0,008 km 23:16 – 23:16 – 0,021 km 23:17 – 23:18 – 0,012 km |
Dénivelé positif |
m |
Toutes les minutes |
20:36 - 20:37 - 3,048 min 20:39 – 20:40 – 3,048 min 23:23 - 23:24 - 9,144 min |
Étages gravis |
étages |
Toutes les minutes |
23:14 - 23:15 - 5 étages 23:16 - 23:16 - 22 étages 23:17 - 23:18 - 8 étages |
Fréquence cardiaque |
bpm |
Toutes les minutes |
06:11 - 55 bpm |
Variabilité Fréquence cardiaqueRmssd |
ms |
Toutes les minutes |
06:11 - 23 ms |
Fréquence respiratoire |
respirations/minute |
Toutes les minutes |
23:14 - 23:15 : 60 respirations/minute 23:16 - 23:16 : 62 respirations/minute 23:17 - 23:18 : 64 respirations/minute |
Saturation en oxygène |
% |
Toutes les heures |
6:11 – 95,208% |
Écrire des sessions
Les données doivent être écrites dans Santé Connect à la fin de l'entraînement ou du sommeil session.
En tant que bonne pratique, toute séance de sommeil
ou séance d'exercice doit être écrite en
l'appareil d'enregistrement et les métadonnées appropriées, y compris
RecordingMethod
Votre application doit au minimum suivre les instructions de la section colonne ci-dessous. Où possible, suivez les "meilleures" conseils.
Données suivies pendant un exercice
Type de données |
Unité |
Disponibilité |
Cordialement, |
Exemple |
Étapes |
pas |
Toutes les minutes |
Toutes les secondes |
23:14-23:15 - 5 pas 23:16 - 23:17 - 22 pas 23:17 - 23:18 - 8 pas |
Rythme de pas |
pas/min |
Toutes les minutes |
Toutes les secondes |
23:14 – 23:15 – 35 p.m. 23:16 - 23:17 - 37 ppm 23:17 – 23:18 – 40 p.m. |
Poussées de fauteuil roulant |
pousse |
Toutes les minutes |
Toutes les secondes |
23:14-23:15 - 5 poussées 23:16 - 23:17 : 22 poussées 23:17 - 23:18 : 8 poussées |
Cadence de pédalage |
rpm |
Toutes les minutes |
Toutes les secondes |
23:14-23:15 – 65 tr/min 23:16 - 23:17 - 70 tr/min 23:17 - 23:18 - 68 tr/min |
Alimentation |
watts |
Toutes les minutes |
Toutes les secondes |
23:14-23:15 - 250 watts 23:16 - 23:17 - 255 watts 23:17 - 23:18 - 245 watts |
Vitesse |
km/min |
Toutes les minutes |
Toutes les secondes |
23:14-23:15 - 0,3 km/min 23:16 - 23:17 - 0,4 km/min 23:17 - 23:18 -0,4 km/min |
Distance |
km/m |
Toutes les minutes |
Toutes les secondes |
23:14-23:15 : 0,008 km 23:16 – 23:16 – 0,021 km 23:17 – 23:18 – 0,012 km |
ActiveCalories brûlées |
Calories |
Toutes les minutes |
Toutes les secondes |
23:14-23:15 : 20 calories 23:16 - 23:17 - 20 calories 23:17 - 23:18 - 25 calories |
TotalCaloriesBrûlées |
Calories |
Toutes les minutes |
Toutes les secondes |
23:14-23:15 : 36 calories 23:16 - 23:17 - 36 calories 23:17 - 23:18 - 41 calories |
Dénivelé positif |
m |
Toutes les minutes |
Toutes les secondes |
20:36 - 20:37 - 3,048 min 20:39 – 20:40 – 3,048 min 23:23 - 23:24 - 9,144 min |
Parcours sportifs |
lat/lng/alt |
Toutes les 3 à 5 secondes |
Toutes les secondes |
|
Fréquence cardiaque |
bpm |
Toutes les minutes |
Toutes les secondes |
23:14-23:15 - 150 bpm 23:16 - 23:17 -152 bpm 23:17 - 23:18 - 155 bpm |
Données enregistrées pendant le sommeil
Type de données |
Unité |
Exemples attendus |
Exemple |
Phase de sommeil |
étape |
Période précise par phase de sommeil |
23:46 - 23:50 : éveillé 23:50 - 23:56 : sommeil léger 23:56 - 00:16 : sommeil profond |
Fréquence cardiaqueau repos |
bpm |
Valeur quotidienne unique (prévue le premier jour de la matinée) |
06:11 - 60 bpm |
Saturation en oxygène |
% |
Valeur quotidienne unique (prévue le premier jour de la matinée) |
6:11 – 95,208% |