Google Fit für Android Verlaufs-API

Google Fit ist eine Plattform, mit der Entwickler Anwendungen erstellen können, die sich auf Daten zur Benutzerfitness konzentrieren. Eines der von Google bereitgestellten Tools ist Google Fit für Android, das als Paket in den Google Play Services verfügbar ist.

In einem früheren Tutorial haben wir untersucht, wie Sie die Google Fit-Aufzeichnungs-API verwenden, um Fitnessdaten über die Google Play-Services zu speichern. In diesem Lernprogramm wird das Thema erweitert, indem Sie erfahren, wie Sie in Google Fit gespeicherte Daten mithilfe der Verlaufs-API abrufen und aktualisieren können.

Was Google Fit so leistungsfähig macht, ist, dass Fitnessdaten über Google Cloud Services gespeichert werden, sodass dieser später abgerufen und analysiert werden kann. Während sich die Sensoren und Aufzeichnungs-APIs auf das Sammeln von Fitnessdaten von einem Android-Gerät konzentrieren, soll die History-API Entwicklern einen einfachen Zugriff auf die gespeicherten Daten ermöglichen.

In diesem Lernprogramm werden Sie durch ein Beispielprojekt geführt, in dem die Arbeit mit der Verlaufs-API veranschaulicht wird. Das fertige Produkt kann von GitHub heruntergeladen werden.

1. Projekteinrichtung

Schritt 1: Richten Sie die Entwicklerkonsole ein

Um Google Fit verwenden zu können, müssen Sie eine OAuth 2.0-Client-ID erstellen und Ihre Anwendung über die Google Developer Console registrieren. Eine ausführliche Beschreibung zum Einrichten eines Projekts in der Google Developer Console finden Sie in meinem Lernprogramm zur Google Fit Sensors-API.

Schritt 2: Erstellen Sie das Android-Projekt

Wenn Sie Ihre Anwendung für die Authentifizierung in der Google Developer Console konfiguriert haben, erstellen Sie mit dem von Ihnen registrierten Paketnamen eine neue Android-Anwendung mit einem Mindest-SDK von 9 und einem leeren Feld Aktivität.

Öffnen Sie die Basis-Android-App build.gradle und fügen Sie Google Play-Dienste in den Abhängigkeitsknoten ein und synchronisieren Sie Ihre App.

"com.google.android.gms: play-services-fitness: 8.4.0" kompilieren

Sie sollten jetzt in der Lage sein, die erforderlichen Google Play Services-Klassen in Ihre Anwendung aufzunehmen. Bevor wir uns mit dem Java-Code für dieses Lernprogramm beschäftigen, öffnen Sie activity_main.xml und ändern Sie es so, dass es fünf enthält Taste Elemente, die wir verwenden werden, um einige Funktionen der History-API zu demonstrieren.

  

Wenn Sie Ihre Anwendung ausführen, sollte die Benutzeroberfläche folgendermaßen aussehen:

Um mit der Einrichtung Ihres Projekts fortzufahren, öffnen Sie MainActivity.java und implementieren Sie die folgenden Rückrufe und erforderlichen Methoden:

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

Sie müssen auch eine Mitgliedsvariable für die hinzufügen GoogleApiClient und eine Reihe von Verweisen auf Ihre Taste Objekte, wie unten gezeigt.

Öffentliche Klasse MainActivity erweitert AppCompatActivity implementiert GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, View.OnClickListener private Button mButtonViewWeek; private Schaltfläche mButtonViewToday; private Schaltfläche mButtonAddSteps; private Schaltfläche mButtonUpdateSteps; private Schaltfläche mButtonDeleteSteps; privater GoogleApiClient mGoogleApiClient; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); mButtonViewWeek = (Button) findViewById (R.id.btn_view_week); mButtonViewToday = (Button) findViewById (R.id.btn_view_today); mButtonAddSteps = (Button) findViewById (R.id.btn_add_steps); mButtonUpdateSteps = (Button) findViewById (R.id.btn_update_steps); mButtonDeleteSteps = (Button) 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 (@Nullable Bundle-Paket) Log.e ("HistoryAPI", "onConnected");  @Override public void onClick (Ansicht v) 

Das letzte, was Sie zum Einrichten Ihres Beispielprojekts tun müssen, ist die Verbindung zu Google Play Services. Dies kann am Ende des getan werden onCreate () Methode.

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

Mit dem obigen Code stellen wir eine Verbindung zu Google Play Services her und fordern den Zugriff auf die Verlaufs-API in Google Fit sowie die Berechtigung zum Lesen und Schreiben von Aktivitätsdaten an. Durch das Hinzufügen der enableAutoManage In diesem Fall verwaltet Google Play Services das Verbinden und Trennen der Verbindung ordnungsgemäß.

2. Verwenden der Google Fit History-API

Mit der History-API können Sie Daten abrufen und zusammenfassen, in Ihrer App gesammelte Werte einfügen oder möglicherweise gespeicherte Daten löschen. Es ist wichtig zu wissen, dass alle History-API-Vorgänge in diesem Lernprogramm vom Haupt-Thread aus ausgeführt werden müssen. Mit anderen Worten, jede Operation findet in einer AsyncTask:

Die private Klasse ViewWeekStepCountTask erweitert AsyncTask protected Void doInBackground (Void… params) displayLastWeeksData (); null zurückgeben; 

Schritt 1: Anzeigen von Daten im Zeitverlauf

Eine Aufgabe, die Sie möglicherweise ausführen möchten, ist die Verwendung oder Anzeige von Daten, die im Laufe der Zeit erfasst wurden. Sie können dies tun, indem Sie ein neues erstellen DataReadRequest für einen bestimmten Datentyp, der auf einige Abfrageparameter passt.

Sie können diese Daten in gruppieren Eimer Objekte nach Zeit oder Sitzungen. In diesem Beispiel fordern Sie aggregierte Schrittdaten für die letzte Woche an und füttern diese Daten nach Tag.

Kalender cal = Calendar.getInstance (); Datum jetzt = neues Datum (); cal.setTime (jetzt); 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)); // Prüfen Sie, wie oft in den letzten 7 Tagen nach dem Ablauf dieser Schritte gesucht wurde , TimeUnit.MILLISECONDS) .build ();

Sobald Sie Ihre haben DataReadRequest erstellt, können Sie Daten vom anfordern GoogleApiClient Verwendung der Fitness.HistoryApi.readData Befehl. Sie rufen auch an erwarten auf dem API-Client, damit der Thread bis zu einer Minute stehen bleibt, während auf die Abfrage gewartet wird. Wenn etwas schief geht, wird der Thread nach dieser Minute fortgesetzt.

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

Wenn der Anruf erfolgreich zurückgegeben wird, können Sie auf die Fitnessdaten des Benutzers zugreifen DataReadResult Objekt. Ihre Schrittdatenanforderung wird in zurückgegeben Eimer Objekte, obwohl andere Datentypen als zurückgegeben werden Liste von DataSet Objekte. Je nach Art der zurückgegebenen Daten können Sie mit dem folgenden Code darauf zugreifen:

// Wird für aggregierte Daten verwendet, wenn (dataReadResult.getBuckets (). Size ()> 0) Log.e ("History", "Anzahl der Buckets:" + dataReadResult.getBuckets (). Size ()); für (Bucket Bucket: dataReadResult.getBuckets ()) List dataSets = bucket.getDataSets (); for (DataSet dataSet: dataSets) showDataSet (dataSet);  // Wird für nicht aggregierte Daten verwendet, sonst if (dataReadResult.getDataSets (). Size ()> 0) Log.e ("History", "Anzahl der zurückgegebenen DataSets:" + dataReadResult.getDataSets (). Size ()); for (DataSet dataSet: dataReadResult.getDataSets ()) showDataSet (dataSet); 

Sie können dann jedes abrufen Datenpunkt von dem DataSet zurückgegebene Objekte.

private void showDataSet (DataSet dataSet) Log.e ("History", "Daten für Datentyp:" + dataSet.getDataType (). getName ()); DateFormat dateFormat = DateFormat.getDateInstance (); DateFormat timeFormat = DateFormat.getTimeInstance (); für (DataPoint dp: dataSet.getDataPoints ()) Log.e ("Verlauf", "Datenpunkt:"); Log.e ("History", "\ tType:" + dp.getDataType (). GetName ()); Log.e ("History", "\ tStart:" + dateFormat.format (dp.getStartTime (TimeUnit.MILLISECONDS)) + "" + timeFormat.format (dp.getStartTime (TimeUnit.MILLISECONDS)); Log.e ("History", "\ tEnd:" + dateFormat.format (dp.getEndTime (TimeUnit.MILLISECONDS)) + "" + timeFormat.format (dp.getStartTime (TimeUnit.MILLISECONDS)); for (Feldfeld: dp.getDataType (). getFields ()) Log.e ("History", "\ tField:" + field.getName () + "Value:" + dp.getValue (field)); 

Wenn eine App auf dem Benutzergerät die Aufzeichnungs-API innerhalb der letzten Woche aktiviert hat, erhalten Sie Daten für jeden Tag, an dem sie aktiv war. Die Protokolle aus dem obigen Code sollten folgendermaßen aussehen:

E / Verlauf: Bereich Start: 17. Februar 2016 E / Verlauf: Bereich Ende: 24. Feb. 2016 E / Verlauf: Anzahl der Buckets: 7 E / Verlauf: Daten, die für den Datentyp zurückgegeben werden: com.google.step_count.delta E / Verlauf: Datenpunkt: E / Verlauf: Typ: com.google.step_count.delta E / Verlauf: Beginn: 17. Februar 2016, 23:01:46 Uhr E / Verlauf: Ende: 17. Februar 2016, 23:01:46 Uhr E / History: Feld: steps Wert: 9360 E / History: Daten für Datentyp: com.google.step_count.delta zurückgegeben E / History: Daten für Datentyp: com.google.step_count.delta E / History: Daten zurückgegeben für Datentyp: com.google.step_count.delta E / History: Datenpunkt: E / History: Typ: com.google.step_count.delta E / History: Start: 21. Feb 2016 09:58:03 E / History : Ende: 21.02.2016 09:58:03 AM E / History: Feld: steps Wert: 10041 E / History: Daten für Datentyp: com.google.step_count.delta E / History: Datenpunkt: E / History : Geben Sie Folgendes ein: com.google.step_count.delta E / Verlauf: Start: 21. Februar 2016, 11:22:53 Uhr E / Verlauf: Ende: 22. Februar 2016, 23:22:53 Uhr E / Verlauf: Feld: Schritte Wert : 10786 E / History: Daten für Datentyp: com.google.step_count.delta E / History: Datenpunkt: E / History: Typ: com.google.step_count.delta E / History: Start: 22. Feb. 2016 11 : 06: 31 PM E / History: Ende: 23.02.2016 23:06:31 PM E / History: Feld: steps Wert: 13099 E / History: Daten für Datentyp: com.google.step_count.delta E / zurückgegeben Verlauf: Datenpunkt: E / Verlauf: Typ: com.google.step_count.delta E / Verlauf: Beginn: 23. Februar 2016 11:02:31 PM E / Verlauf: Ende: 24. Februar 2016 11:02:31 PM E / History: Feld: Schritte Wert: 9765

Schritt 2: Daten für heute anzeigen

Sie wissen jetzt, wie Sie Google Fit-Daten basierend auf einem Zeitrahmen abrufen. Entwickler haben häufig Gebrauch von Daten für den aktuellen Tag. Zum Glück hat Google dies durch Hinzufügen von Fitness.GeschichteApi.readDailyTotal anruf, der ein erstellt DailyTotalResult Objekt mit Daten, die für den Tag erfasst wurden.

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

Der obige Code meldet die Schrittdaten des Benutzers für den Tag ab.

E / History: Daten für Datentyp: com.google.step_count.delta E / History: Datenpunkt: E / History: Typ: com.google.step_count.delta E / History: Start: 24. Februar 2016 8:39 : 59 AM E / Verlauf: Ende: 24. Feb 2016 8:39:59 Uhr E / History: Feld: Schritte Wert: 9474

Schritt 3: Einfügen von Daten in Google Fit

Das Lesen von Daten aus Google Fit ist zwar wichtig, aber es kann vorkommen, dass Sie Ihre eigenen erfassten Daten zum Google Fit-Datenspeicher hinzufügen müssen. Dazu wählen Sie einen Zeitbereich für die Daten aus und erstellen einen Datenquelle Objekt, das die Informationen darstellt, die Sie in Google Fit eingeben. Als Nächstes erstellen Sie eine DataSet Objekt und platzieren Sie ein neues Datenpunkt für den Einfügevorgang hinein.

In diesem Beispiel gehen wir davon aus, dass der Benutzer eine Million Schritte oder ungefähr 500 Meilen zurückgelegt hat, und fügen diese Rohschrittdaten in die letzte Stunde der Benutzeraktivität ein.

Wenn Sie einen Zeitraum auswählen, der sich über mehrere Tage erstreckt, ist die Anzahl der Schritte, die Sie einfügen, gleichmäßig auf diese Tage verteilt.

Kalender cal = Calendar.getInstance (); Datum jetzt = neues Datum (); cal.setTime (jetzt); 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 ("Step Count") .setType (DataSource.TYPE_RAW) .build (); int stepCountDelta = 1000000; DataSet dataSet = DataSet.create (dataSource); DataPoint-Punkt = dataSet.createDataPoint () .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS); point.getValue (Field.FIELD_STEPS) .setInt (stepCountDelta); dataSet.add (Punkt);

Nach dem Erstellen der DataSet Objekt können Sie es mithilfe der History-APIs in den Google Fit-Datenspeicher einfügen insertData Anruf.

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

Wenn Sie die Schritte des Benutzers einfügen und dann das Aktivitätsprotokoll lesen, sollte Folgendes angezeigt werden:

E / History: Daten für Datentyp: com.google.step_count.delta E / History: Datenpunkt: E / History: Typ: com.google.step_count.delta E / History: Start: 27. Feb 2016 10:05 : 18 PM E / History: Ende: 28. Feb 2016 22:05:18 PM E / History: Feld: Schritte Wert: 1008747

Schritt 4: Aktualisieren Sie die Daten bei Google Fit

Nachdem Sie Daten in Google Fit eingefügt haben, können Sie keine weiteren Daten dieses Typs einfügen, wenn diese mit den vorhandenen Daten überlappen. Dies kann zu einem Problem führen, wenn der Benutzer 500 Meilen und dann 500 weitere Schritte gegangen ist.

Um dieses Problem zu lösen, müssen Sie die Daten aktualisieren Anruf. Glücklicherweise ist das Aktualisieren von Daten fast identisch mit dem Einfügen neuer Daten, außer dass Sie eine erstellen DataUpdateRequest stattdessen.

Kalender cal = Calendar.getInstance (); Datum jetzt = neues Datum (); cal.setTime (jetzt); 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 ("Step Count") .setType (DataSource.TYPE_RAW) .build (); int stepCountDelta = 2000000; DataSet dataSet = DataSet.create (dataSource); DataPoint-Punkt = dataSet.createDataPoint () .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS); point.getValue (Field.FIELD_STEPS) .setInt (stepCountDelta); dataSet.add (Punkt); DataUpdateRequest updateRequest = new DataUpdateRequest.Builder (). SetDataSet (dataSet) .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS) .build (); Fitness.HistoryApi.updateData (mGoogleApiClient, updateRequest) .await (1, TimeUnit.MINUTES);

Wenn Sie die Schritte des Benutzers für den Tag nach dem Ausführen des obigen Befehls abmelden, sollten Sie über zwei Millionen Schritte sehen.

E / History: Daten für Datentyp: com.google.step_count.delta E / History: Datenpunkt: E / History: Typ: com.google.step_count.delta E / History: Start: 27. Feb 2016 10:05 : 18 Uhr E / Verlauf: Ende: 28. Februar 2016 22:05:18 Uhr E / Verlauf: Feld: Schritte Wert: 2008747

Schritt 5: Löschen von Daten aus Google Fit

Der letzte Vorgang, der über die Google Fit-Verlaufs-API verfügbar ist, ist die Möglichkeit, Daten zu löschen, die Sie in Google Fit gespeichert haben. Dies kann durch Auswählen eines Datumsbereichs und Erstellen eines erfolgen DataDeleteRequest Objekt und Aufruf Daten löschen aus der History-API. Während Sie Ihre eigenen eingefügten Daten löschen können, werden von Google Fit gespeicherte Daten nicht entfernt.

Kalender cal = Calendar.getInstance (); Datum jetzt = neues Datum (); cal.setTime (jetzt); long endTime = cal.getTimeInMillis (); cal.add (Calendar.DAY_OF_YEAR, -1); long startTime = cal.getTimeInMillis (); DataDeleteRequest request = new DataDeleteRequest.Builder () .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS) .addDataType (DataType.TYPE_STEP_COUNT_DELTA) .build (); Fitness.HistoryApi.deleteData (mGoogleApiClient, Anforderung) .await (1, TimeUnit.MINUTES);

Fazit

Wie Sie gesehen haben, ist die History-API ein unglaublich leistungsfähiges Werkzeug für den Zugriff auf und die Bearbeitung des Google Fit-Datenspeichers. Während andere Google Fit-APIs zum Sammeln von Daten vorgesehen sind, können Sie mit der Verlaufs-API Daten verwalten und für die Analyse darauf zugreifen. Sie sollten jetzt in der Lage sein, erstaunliche Apps zu erstellen, die diese Funktion nutzen.