Google Fit pour Android API d'historique

Google Fit est une plateforme qui permet aux développeurs de créer des applications axées sur les données de condition physique des utilisateurs. L'un des outils fournis par Google est Google Fit pour Android, disponible sous forme de package dans les services Google Play..

Dans un précédent tutoriel, nous avons exploré l'utilisation de l'API d'enregistrement Google Fit pour stocker des données de condition physique via les services Google Play. Ce didacticiel développe le sujet en expliquant comment accéder aux données stockées dans Google Fit et les mettre à jour à l'aide de l'API Historique..

La puissance de Google Fit réside dans le fait que les données de condition physique sont stockées via Google Cloud Services, ce qui permet de les consulter et de les analyser ultérieurement. Alors que les API de capteurs et d’enregistrement se concentrent sur la collecte de données de condition physique à partir d’un appareil Android, l’API History est conçue pour permettre aux développeurs d’accéder facilement aux données stockées..

Ce tutoriel vous guide dans un exemple de projet qui montre comment utiliser l'API History. Le produit fini peut être téléchargé à partir de GitHub.

1. Configuration du projet

Étape 1: Configuration de la console du développeur

Pour utiliser Google Fit, vous devez créer un ID client OAuth 2.0 et enregistrer votre application via la console Google Developer. Vous trouverez une explication détaillée sur la configuration d'un projet dans la console développeur de Google dans mon tutoriel sur l'API Google Fit Sensors..

Étape 2: Créer le projet Android

Une fois que votre application est configurée pour l'authentification dans la console pour les développeurs Google, utilisez le nom du package que vous avez enregistré pour créer une nouvelle application Android avec un SDK minimal de 9 et un espace vide. Activité.

Avec l'application Android de base créée, ouvrez build.gradle et incluez les services Google Play sous le nœud des dépendances et synchronisez votre application..

compilez 'com.google.android.gms: play-services-fitness: 8.4.0'

Vous devriez maintenant pouvoir inclure les classes de services Google Play nécessaires dans votre application. Avant de plonger dans le code Java de ce tutoriel, ouvrez activity_main.xml et modifiez-le pour qu'il comprenne cinq Bouton éléments que nous utiliserons pour illustrer certaines des fonctionnalités de l'API d'historique.

  

Lorsque vous exécutez votre application, l'interface utilisateur devrait ressembler à ceci:

Pour continuer à configurer votre projet, ouvrez MainActivity.java et implémentez les callbacks suivants et les méthodes requises:

  • GoogleApiClient.ConnectionCallbacks
  • GoogleAPiClient.OnConnectionFailedListener
  • View.OnClickListener

Vous devez également ajouter une variable membre pour le GoogleApiClient et un ensemble de références à votre Bouton objets, comme indiqué ci-dessous.

Classe publique MainActivity caps AppCompatActivity implémente GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, View.OnClickListener private Button mButtonViewWeek; Bouton privé mButtonViewToday; bouton privé mButtonAddSteps; Bouton privé mButtonUpdateSteps; bouton privé mButtonDeleteSteps; private GoogleApiClient mGoogleApiClient; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); mButtonViewWeek = (Bouton) findViewById (R.id.btn_view_week); mButtonViewToday = (Bouton) findViewById (R.id.btn_view_today); mButtonAddSteps = (Bouton) findViewById (R.id.btn_add_steps); mButtonUpdateSteps = (Bouton) findViewById (R.id.btn_update_steps); mButtonDeleteSteps = (Bouton) findViewById (R.id.btn_delete_steps); mButtonViewWeek.setOnClickListener (this); mButtonViewToday.setOnClickListener (this); mButtonAddSteps.setOnClickListener (this); mButtonUpdateSteps.setOnClickListener (this); mButtonDeleteSteps.setOnClickListener (this);  @Override public void onConnectionSuspended (int i) Log.e ("HistoryAPI", "onConnectionSuspended");  @Override public void onConnectionFailed (@NonNull ConnectionResult connectionResult) Log.e ("HistoryAPI", "onConnectionFailed");  public void onConnected (ensemble @Nullable Bundle) Log.e ("HistoryAPI", "onConnected");  @Override public void onClick (Afficher v) 

La dernière chose à faire pour configurer votre exemple de projet est de vous connecter aux services Google Play. Cela peut être fait à la fin de la onCreate () méthode.

mGoogleApiClient = new GoogleApiClient.Builder (this) .addApi (Fitness.HISTORY_API) .addScope (new Scope (Scopes.FITNESS_ACTIVITY_READ_WRITE)) .addConnectionCallbacks (this) .enableAutoManage (this, 0, this).

Avec le code ci-dessus, nous nous connectons aux services Google Play et demandons l'accès à l'API Historique dans Google Fit, ainsi que l'autorisation de lire et d'écrire des données d'activité. En ajoutant le enableAutoManage propriété, les services Google Play gèrent correctement la connexion et la déconnexion..

2. Utilisation de l'API Google Fit History

À l'aide de l'API d'historique, vous pouvez récupérer et agréger des données, insérer des valeurs que vous avez collectées dans votre application ou supprimer des données pouvant être stockées. Une chose importante à noter est que toutes les opérations de l’API Historique dans ce tutoriel doivent être effectuées à partir du thread principal. En d’autres termes, chaque opération a lieu dans un AsyncTask:

classe privée ViewWeekStepCountTask étend AsyncTask protected Void doInBackground (Void… paramètres) displayLastWeeksData (); return null; 

Étape 1: Affichage des données au fil du temps

Une tâche que vous pouvez effectuer consiste à utiliser ou afficher les données collectées au fil du temps. Vous pouvez le faire en créant un nouveau DataReadRequest pour un type de données spécifique correspondant à certains paramètres de requête.

Vous pouvez regrouper ces données dans Seau objets par heure ou par sessions. Pour cet exemple, vous demandez des données d’étape agrégées pour la semaine écoulée et définissez ces baies par jour..

Calendrier cal = Calendar.getInstance (); Date now = new Date (); cal.setTime (maintenant); long endTime = cal.getTimeInMillis (); cal.add (Calendar.WEEK_OF_YEAR, -1); long startTime = cal.getTimeInMillis (); java.text.DateFormat dateFormat = DateFormat.getDateInstance (); Log.e ("History", "Range Start:" + dateFormat.format (startTime)); Log.e ("History", "Range End:" + dateFormat.format (endTime)); // Vérifier le nombre d'étapes parcourues et enregistrées au cours des 7 derniers jours. DataReadRequest readRequest = new DataReadRequest.Builder () .aggregate (DataType.TYPE_TYP_COUNT_DELTA, DataType.AGGREGATE_STEP_COUNT_DOUNTA) .boutket , TimeUnit.MILLISECONDS) .build ();

Une fois que vous avez votre DataReadRequest créé, vous pouvez demander des données à GoogleApiClient en utilisant le Fitness.HistoryApi.readData commander. Vous appelez aussi attendre sur le client API afin que le thread se bloque pendant une minute en attendant la requête. Si quelque chose ne va pas, le fil continue après cette minute.

DataReadResult dataReadResult = Fitness.HistoryApi.readData (mGoogleApiClient, readRequest) .await (1, TimeUnit.MINUTES);

Si l'appel retourne avec succès, vous pouvez accéder aux données de condition physique de l'utilisateur à partir du DataReadResult objet. Votre demande de données de pas est renvoyée dans Seau objets, bien que d’autres types de données soient retournés sous forme de liste de DataSet objets. En fonction du type de données renvoyées, vous pouvez y accéder avec le code suivant:

// Utilisé pour les données agrégées if (dataReadResult.getBuckets (). Size ()> 0) Log.e ("History", "Nombre de compartiments:" + dataReadResult.getBuckets (). Size ()); for (Bucket bucket: dataReadResult.getBuckets ()) Liste dataSets = bucket.getDataSets (); for (DataSet dataSet: dataSets) showDataSet (dataSet);  // Utilisé pour les données non agrégées sinon if (dataReadResult.getDataSets (). Size ()> 0) Log.e ("History", "Nombre de DataSets renvoyés:" + dataReadResult.getDataSets (). Size ()); for (DataSet dataSet: dataReadResult.getDataSets ()) showDataSet (dataSet); 

Vous pouvez ensuite récupérer chaque Point de données du DataSet objets qui ont été retournés.

void privé showDataSet (DataSet dataSet) Log.e ("Historique", "Données renvoyées pour le type de données:" + dataSet.getDataType (). getName ()); DateFormat dateFormat = DateFormat.getDateInstance (); DateFormat timeFormat = DateFormat.getTimeInstance (); for (DataPoint dp: dataSet.getDataPoints ()) Log.e ("Historique", "Point de données:"); Log.e ("Historique", "\ tType:" + dp.getDataType (). GetName ()); Log.e ("Historique", "\ tStart:" + dateFormat.format (dp.getStartTime (TimeUnit.MILLISECONDS)) + "" + timeFormat.format (dp.getStartTime (TimeUnit.MILLISECONDS))); Log.e ("Historique", "\ tEnd:" + dateFormat.format (dp.getEndTime (TimeUnit.MILLISECONDS)) + "" + timeFormat.format (dp.getStartTime (TimeUnit.MILLISECONDS))); pour (champ field: dp.getDataType (). getFields ()) Log.e ("History", "\ tField:" + field.getName () + "Valeur:" + dp.getValue (field)); 

Si une application sur l'appareil de l'utilisateur a activé l'API d'enregistrement au cours de la semaine écoulée, vous recevez des données pour chaque jour où elle était active. Les journaux du code ci-dessus devraient ressembler à ceci:

E / Historique: Début de la plage: 17 févr. 2016 E / Historique: Fin de la série: 24 févr. 2016 E / Historique: Nombre de compartiments: 7 E / Historique: Données renvoyées pour Type de données: com.google.step_count.delta E / Historique: Point de données: E / Historique: Type: com.google.step_count.delta E / Historique: Début: 17 févr. 2016 23:01:46 E / Historique: Fin: 17 févr. 2016 23:01:46 E / Historique: Champ: Etapes Valeur: 9360 E / Historique: Données renvoyées pour le type de données: com.google.step_count.delta E / Historique: Données renvoyées pour le type de données: com.google.step_count.delta E / Historique: Données renvoyées pour Type de données: com.google.step_count.delta E / Historique: Point de données: E / Historique: Type: com.google.step_count.delta E / Historique: Début: 21 févr. 2016 09:58:03 E / Historique : Fin: 21 févr. 2016 09:58:03 E / Historique: Champ: Etapes Valeur: 10041 E / Historique: Données renvoyées pour Type de données: com.google.step_count.delta E / Historique: Point de données: E / Historique : Type: com.google.step_count.delta E / Historique: Début: 21 févr. 2016 23:22:53 E / Historique: Fin: 22 févr. 2016 23:22:53 E / Historique: Champ: étapes Valeur : 10786 E / Historique: Données renvoyées pour Type de données: com.google.step_count.delta E / Historique: Point de données: E / Historique: Type: com.google.step_count.delta E / Historique: Début: 22 févr. 2016 11 : 06: 31 PM E / Historique: Fin: 23 févr. 2016 23:06:31 E / Historique: Champ: étapes Valeur: 13099 E / Historique: Données renvoyées pour le type de données: com.google.step_count.delta E / Historique: Point de données: E / Historique: Type: com.google.step_count.delta E / Historique: Début: 23 févr. 2016 23:02:31 E / Historique: Fin: 24 févr. 2016 23:02:31 E / Historique: Champ: Etapes Valeur: 9765

Étape 2: Affichage des données pour aujourd'hui

Vous savez maintenant comment récupérer des données Google Fit en fonction d'un calendrier. Les développeurs de cas d'utilisation ont souvent besoin de données pour la journée en cours. Heureusement, Google a rendu cela facile en ajoutant le Fitness.HistoryApi.readDailyTotal appel, qui crée un DailyTotalResult objet contenant les données collectées pour la journée.

displayStepDataForToday () DailyTotalResult result = Fitness.HistoryApi.readDailyTotal (mGoogleApiClient, DataType.TYPE_STEP_COUNT_DELTA) .await (1, TimeUnit.MINUTES); showDataSet (result.getTotal ()); 

Le code ci-dessus déconnecte les données de pas de l'utilisateur pour la journée.

E / Historique: Données renvoyées pour le type de données: com.google.step_count.delta E / Historique: Point de données: E / Historique: Type: com.google.step_count.delta E / Historique: Début: 24 févr. 2016 8:39 : 59 AM E / Historique: Fin: 24 févr. 2016 08:39:59 E / Historique: Champ: étapes Valeur: 9474

Étape 3: Insertion de données dans Google Fit

Bien qu'il soit important de pouvoir lire des données à partir de Google Fit, il peut être nécessaire d'ajouter vos propres données collectées au magasin de données Google Fit. Pour ce faire, vous sélectionnez une plage de temps pour les données et créez un La source de données objet qui représente le type d'informations que vous avez insérées dans Google Fit. Ensuite, vous créez un DataSet objet et place un nouveau Point de données en elle pour l'opération d'insertion.

Pour cet exemple, nous allons supposer que l'utilisateur a parcouru un million de pas, soit environ 500 miles, et insérer ces données de pas brutes dans la dernière heure d'activité de l'utilisateur..

Il est important de noter que si vous sélectionnez une plage de temps s'étendant sur plusieurs jours, le nombre d'étapes que vous insérez est distribué de manière égale entre ces jours..

Calendrier cal = Calendar.getInstance (); Date now = new Date (); cal.setTime (maintenant); long endTime = cal.getTimeInMillis (); cal.add (Calendar.HOUR_OF_DAY, -1); long startTime = cal.getTimeInMillis (); DataSource dataSource = new DataSource.Builder () .setAppPackageName (this) .setDataType (DataType.TYPE_STEP_COUNT_DELTA) .setName ("Nombre de pas") .setType (DataSource.TYPE_RAW) .build (); int stepCountDelta = 1000000; DataSet dataSet = DataSet.create (dataSource); Point de données = dataSet.createDataPoint () .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS); point.getValue (Field.FIELD_STEPS) .setInt (stepCountDelta); dataSet.add (point);

Après avoir créé le DataSet objet, vous pouvez l'insérer dans le magasin de données Google Fit à l'aide de l'API d'historique. insertData appel.

Fitness.HistoryApi.insertData (mGoogleApiClient, dataSet) .await (1, TimeUnit.MINUTES);

Si vous insérez les étapes de l'utilisateur, puis lisez le journal d'activité, vous devriez voir quelque chose de similaire au suivant:

E / Historique: Données renvoyées pour le type de données: com.google.step_count.delta E / Historique: Point de données: E / Historique: Type: com.google.step_count.delta E / Historique: Début: 27 févr. 2016 10:05 : 18h00 E / Historique: Fin: 28 février 2016 22:05:18 E / Historique: Champ: Etapes Valeur: 1008747

Étape 4: Mise à jour des données sur Google Fit

Une fois que vous avez inséré des données dans Google Fit, vous ne pouvez plus insérer de données de ce type si elles chevauchent des données existantes. Cela pourrait poser problème si l’utilisateur avait parcouru 500 km, puis 500 km de plus..

Pour résoudre ce problème, vous devez utiliser le updateData appel. Heureusement, la mise à jour des données est presque identique à l’insertion de nouvelles données, sauf que vous créez une DataUpdateRequest au lieu.

Calendrier cal = Calendar.getInstance (); Date now = new Date (); cal.setTime (maintenant); long endTime = cal.getTimeInMillis (); cal.add (Calendar.HOUR_OF_DAY, -1); long startTime = cal.getTimeInMillis (); DataSource dataSource = new DataSource.Builder () .setAppPackageName (this) .setDataType (DataType.TYPE_STEP_COUNT_DELTA) .setName ("Nombre de pas") .setType (DataSource.TYPE_RAW) .build (); int stepCountDelta = 2000000; DataSet dataSet = DataSet.create (dataSource); Point de données = dataSet.createDataPoint () .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS); point.getValue (Field.FIELD_STEPS) .setInt (stepCountDelta); dataSet.add (point); DataUpdateRequest updateRequest = new DataUpdateRequest.Builder (). SetDataSet (dataSet) .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS) .build (); Fitness.HistoryApi.updateData (mGoogleApiClient, updateRequest) .await (1, TimeUnit.MINUTES);

Si vous devez déconnecter les étapes de l'utilisateur pour le lendemain de l'exécution de l'opération ci-dessus, vous devriez voir plus de deux millions d'étapes..

E / Historique: Données renvoyées pour le type de données: com.google.step_count.delta E / Historique: Point de données: E / Historique: Type: com.google.step_count.delta E / Historique: Début: 27 févr. 2016 10:05 : 18h00 E / Historique: Fin: 28 février 2016 22:05:18 E / Historique: Champ: Etapes Valeur: 2008747

Étape 5: Suppression de données de Google Fit

La dernière opération disponible via l'API d'historique de Google Fit consiste à supprimer les données que vous avez stockées dans Google Fit. Cela peut être fait en sélectionnant une plage de dates, en créant un DataDeleteRequest objet, et appelant Suprimmer les données à partir de l’API History. Bien que vous puissiez supprimer vos propres données insérées, les données stockées par Google Fit ne sont pas supprimées..

Calendrier cal = Calendar.getInstance (); Date now = new Date (); cal.setTime (maintenant); long endTime = cal.getTimeInMillis (); cal.add (Calendar.DAY_OF_YEAR, -1); long startTime = cal.getTimeInMillis (); Demande DataDeleteRequest = new DataDeleteRequest.Builder () .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS) .addDataType (DataType.TYPE_STEP_COUNT_DELTA) .build (); Fitness.HistoryApi.deleteData (mGoogleApiClient, demande) .await (1, TimeUnit.MINUTES);

Conclusion

Comme vous l'avez vu, l'historique API est un outil incroyablement puissant pour accéder et manipuler le magasin de données Google Fit. Tandis que d'autres API Google Fit sont destinées à collecter des données, l'API Historique vous permet de gérer et d'accéder aux données à des fins d'analyse. Vous devriez maintenant pouvoir créer des applications étonnantes qui tirent parti de cette fonctionnalité..