Google Fit für Android Sitzungs-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 dieser Serie haben wir bereits erläutert, wie Sie Fitnessdaten über Google Play Services mithilfe der Aufzeichnungs-API speichern und wie Sie über die Verlaufs-API auf Daten zugreifen und sie aktualisieren können. In diesem Lernprogramm erweitern wir diese Ideen mit der Sessions-API, mit der Sie Aktivitätsdaten nach Zeitintervallen organisieren können.

In diesem Lernprogramm werden Sie durch ein Beispielprojekt geführt, in dem die Arbeit mit der Sitzungs-API veranschaulicht wird. Das fertige Projekt 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: Einrichten des Android-Projekts

Wenn Sie Ihre Anwendung für die Authentifizierung in der Google Developer Console konfiguriert haben, verwenden Sie den von Ihnen registrierten Paketnamen, um eine neue Android-Anwendung mit einer leeren zu erstellen Aktivität.

Öffnen Sie das erstellte Android-Projekt build.gradle und fügen Sie Google Play-Dienste in den Abhängigkeitsknoten ein und synchronisieren Sie Ihre App. In diesem Beispiel verwende ich auch die Butter Knife-Bibliothek, um den Kesselplattencode für Klick-Listener und das Finden zu reduzieren Aussicht Artikel.

comp.google.android.gms: play-services-fitness: 8.4.0 'com.jakewharton: butterknife: 7.0.1' kompilieren

Öffnen Sie, nachdem Sie Ihre Abhängigkeiten synchronisiert haben AndroidManifest.xml und enthalten die ACCESS_FINE_LOCATION Genehmigung. Diese Berechtigung ist erforderlich, um Sitzungsdaten von Google Fit zu lesen. Während ich in diesem Tutorial nicht ins Detail gehe, ist es erwähnenswert, dass Sie, wenn Sie auf API 23 oder höher zielen, die Standortgenehmigung vom Benutzer anfordern müssen.

Als nächstes öffnen activity_main.xml und aktualisieren Sie es so, dass es fünf enthält Taste Elemente, die verwendet werden, um einige Funktionen der Sessions-API zu demonstrieren. Das Endergebnis sollte folgendermaßen aussehen:

Sobald das Layout erstellt wurde, öffnen Sie es MainActivity.java und stellen Sie eine Verbindung zu Google Play Services her.

public class MainActivity erweitert AppCompatActivity implementiert GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener private final String SESSION_NAME = "Sitzungsname"; privater GoogleApiClient mGoogleApiClient = null; private Session mSession; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); ButterKnife.bind (this); mGoogleApiClient = neuer GoogleApiClient.Builder (this) .addApi (Fitness.SESSIONS_API) .addApi (Fitness.HISTORY_API) .addScope (neuer Bereich) (neuer Adapter) (.). .enableAutoManage (this, 0, this) .build ();  @Override protected void onDestroy () super.onDestroy (); ButterKnife.unbind (this);  @Override public void onConnected (Bundle-Paket)  @Override public void onConnectionSuspended (int i)  @Override public void onConnectionFailed (@NonNull ConnectionResult connectionResult) 

Möglicherweise haben Sie festgestellt, dass Sie die Verlaufs-API zusammen mit der Sitzungs-API hinzufügen. Dies ist erforderlich, da die Verlaufs-API zum Löschen von Sitzungsdaten verwendet wird, auf die wir später in diesem Lernprogramm eingehen. Sie müssen auch beide verwenden FITNESS_LOCATION_READ_WRITE und FITNESS_ACTIVITY_READ_WRITE Bereichseigenschaften für die Sessions-API-Funktionen, die wir besprechen werden.

Nachdem Sie Ihre App für die Verbindung zu Google Play Services und Google Fit eingerichtet haben, können Sie die Session-API ausprobieren.

2. Verwenden der Session-API

Die Session-API ist ein weiteres Tool von Google Fit zum Speichern von Fitnessdaten für den Nutzer. Daher ist es nicht als Ersatz für die Aufzeichnungs- oder Verlaufs-APIs gedacht, sondern stellt eine zusätzliche Möglichkeit dar, Ihre Apps für eine bessere Benutzererfahrung zu verbessern.

In diesem Abschnitt erfahren Sie, wie Sie eine Echtzeit-Sitzungsdatenerfassung starten und stoppen, wie Sie eine Sitzung in den Google Fit-Datenspeicher einfügen, wie Sie zuvor gespeicherte Sitzungsdaten lesen und wie Sie unnötige oder falsche Sitzungen löschen. Ähnlich wie bei der History-API müssen Sessions-API-Aufrufe aus dem Hauptthread ausgeführt werden. Während des Lernprogramms für die History-API wurden Vorgänge in AsyncTask In diesem Tutorial wird das Verwenden von PendingResult Rückrufe, um Aufgaben zu verfolgen.

Eine Sitzung starten und stoppen

Das häufigste Szenario für die Sitzungs-API ist das Aufzeichnen von Informationen, nachdem ein Benutzer eine Fitnessaktivität initiiert hat. Dies wird häufig gleichzeitig mit der Aufzeichnungs-API gestartet, so dass Sensordaten dem Sitzungszeitraum zugeordnet werden können. Um mit der Aufzeichnung einer Sitzung zu beginnen, müssen Sie ein Sitzungsobjekt mit einem Namen, einer eindeutigen Kennung, einer Beschreibung, einer Startzeit und der Art der Aktivität erstellen, die der Benutzer ausführt.

mSession = new Session.Builder () .setName (SESSION_NAME) .setIdentifier (getString (R.string.app_name) + "" + System.currentTimeMillis ()) .setDescription ("Yoga Session Description") .setStartTime (Calendar.getInstance ( ) .getTimeInMillis (), TimeUnit.MILLISECONDS) .setActivity (FitnessActivities.YOGA) .build ();

Einmal dein Session Objekt erstellt wird, können Sie aufrufen startSession in der Sitzungs-API, um mit der Aufzeichnung der Aktivitäten Ihres Benutzers zu beginnen.

PendingResult pendingResult = Fitness.SessionsApi.startSession (mGoogleApiClient, mSession); pendingResult.setResultCallback (neuer ResultCallback() @Override public void onResult (Statusstatus) if (status.isSuccess ()) Log.i ("Tuts +", "Sitzung erfolgreich gestartet");  else Log.i ("Tuts +", "Sitzung konnte nicht gestartet werden:" + status.getStatusMessage ()); );

Wenn Ihr Benutzer seine Aktivität beendet hat, können Sie die Sitzung durch Aufrufen beenden stopSession mit der eindeutigen Kennung für die Session.

PendingResult pendingResult = Fitness.SessionsApi.stopSession (mGoogleApiClient, mSession.getIdentifier ()); pendingResult.setResultCallback (neuer ResultCallback() @Override public void onResult (SessionStopResult sessionStopResult) if (sessionStopResult.getStatus (). IsSuccess ()) Log.i ("Tuts +", "Sitzung erfolgreich beendet");  else Log.i ("Tuts +", "Sitzung konnte nicht angehalten werden:" + sessionStopResult.getStatus (). getStatusMessage ()); );

Bemerkenswert ist hier, dass das Session Objekt implementiert das Paketierbar Schnittstelle, so kann es in einem gespeichert werden Bündeln falls Sie es speichern oder an eine andere Komponente in Ihrer Anwendung übergeben müssen. Dies kann nützlich sein, wenn der Benutzer eine Aktivität startet und die App dann schließt. Möglicherweise benötigen Sie diese Sitzungsdaten später, um die Aufzeichnung der Sitzung zu beenden.

Einfügen in Google Fit

Nun, da Sie wissen, wie Echtzeit-Sitzungsinformationen aufgezeichnet werden, besteht der nächste Schritt darin, Sitzungen nachträglich einzufügen. Sie können einen Zeitblock als Sitzung einfügen. Mit der Sitzungs-API können Sie jedoch auch Aktivitäten mit Segmenten einer Sitzung verknüpfen. Dies ist nützlich in Situationen, in denen der Benutzer während seiner gesamten Fitnessroutine möglicherweise nicht ständig die gleiche Aktivität ausführt.

Ein Beispiel hierfür kann sein, wenn Ihre App erkannt hat, dass der Benutzer ausgeführt wurde, sich kurz ausruhte und anschließend erneut ausgeführt wurde. Im folgenden Beispiel fügen Sie ein Session Dort hat der Benutzer 15 Minuten lang gelaufen, fünf Minuten gelaufen und dann weitere 15 Minuten ausgeführt, indem er nachverfolgte, wann der Benutzer die einzelnen Aktivitäten gestartet und beendet hat. Sie notieren auch ihre Durchschnittsgeschwindigkeit für jede dieser Aktivitäten.

Kalender calendar = Calendar.getInstance (); Datum jetzt = neues Datum (); calendar.setTime (jetzt); long endTime = calendar.getTimeInMillis (); calendar.add (Calendar.MINUTE, -15); long walkEndTime = calendar.getTimeInMillis (); calendar.add (Calendar.MINUTE, -5); long walkStartTime = calendar.getTimeInMillis (); calendar.add (Calendar.MINUTE, -15); long startTime = calendar.getTimeInMillis (); float firstRunSpeed ​​= 15; Float walkSpeed ​​= 5; Float secondRunSpeed ​​= 13;

Sobald Sie die Schlüsselwerte für Zeit und Geschwindigkeit festgelegt haben, müssen Sie zwei erstellen DataSet Gruppen zum Speichern von Informationen zu Aktivitäten und Geschwindigkeit. Diese können aus einem Satz von erstellt werden Datenquelle Objekte mit den entsprechenden Datentyp Eigenschaften festgelegt.

DataSource speedSegmentDataSource = new DataSource.Builder () .setAppPackageName (this.getPackageName ()) .setDataType (DataType.TYPE_SPEED) .setName ("Tuts + Speed-Dataset") .setType (DataSource.TYPE_RAW) .build (); DataSource activitySegmentDataSource = new DataSource.Builder () .setAppPackageName (this.getPackageName ()) .setDataType (DataType.TYPE_ACTIVITY_SEGMENT) .setName ("Tuts + Activity-Segment-Dataset") .setType (DataSource.TYPE_RAW); DataSet speedDataSet = DataSet.create (speedSegmentDataSource); DataSet activityDataSet = DataSet.create (activitySegmentDataSource);

Als nächstes müssen Sie das erstellen Datenpunkt Objekte, die in den Google Fit-Datenspeicher eingefügt werden. Jeder Datenpunkt hat ein Zeitintervall und eine Menge von Feld Eigenschaften, die verwandte Daten speichern. Einmal jeweils Datenpunkt konfiguriert ist, müssen Sie es in die richtige einfügen DataSet. Der Kürze halber zeige ich nur den Code-Ausschnitt zum Erstellen Datenpunkt Objekte für das erste Laufsegment unten werden die anderen Datenpunktobjekte jedoch im Quellcode dieses Tutorials auf GitHub angezeigt.

// Geschwindigkeitsdatenpunkt für erstes Laufsegment erstellen DataPoint firstRunSpeedDataPoint = speedDataSet.createDataPoint () .setTimeInterval (startTime, walkStartTime, TimeUnit.MILLISECONDS); firstRunSpeedDataPoint.getValue (Field.FIELD_SPEED) .setFloat (firstRunSpeed); speedDataSet.add (firstRunSpeedDataPoint); // Aktivitätsdatenpunkt für zweiten Laufsegment erstellen DataPoint secondRunActivityDataPoint = activityDataSet.createDataPoint () .setTimeInterval (walkEndTime, endTime, TimeUnit.MILLISECONDS); secondRunActivityDataPoint.getValue (Field.FIELD_ACTIVITY) .setActivity (FitnessActivities.RUNNING); activityDataSet.add (secondRunActivityDataPoint);

Sobald Sie die beiden gefüllt haben DataSet Gruppen, ist es Zeit, die zu erstellen Session das wirst du einfügen. Diese Session müssen den Namen, die eindeutige Kennung, die Beschreibung, die Start- und Endzeiten sowie die Aktivitätseigenschaften festlegen. Wichtig ist zu beachten, dass der Name, den Sie beim Einfügen von a verwenden Session ist der Name, den Sie verwenden müssen, wenn Sie später versuchen, diese Sitzung zu lesen.

Session session = new Session.Builder () .setName (SESSION_NAME) .setIdentifier (getString (R.string.app_name) + "" + System.currentTimeMillis ()) .setDescription ("Running in Segments") .setStartTime (startTime, TimeUnit) .MILLISECONDS) .setEndTime (endTime, TimeUnit.MILLISECONDS) .setActivity (FitnessActivities.RUNNING) .build ();

Nun das dein Session erstellt wird, müssen Sie ein erstellen SessionInsertRequest, fügen Sie Ihre DataSet Objekte dazu und fügen Sie das ein Session in Google Fit.

SessionInsertRequest insertRequest = new SessionInsertRequest.Builder () .setSession (session) .addDataSet (speedDataSet) .addDataSet (activityDataSet) .build (); PendingResult pendingResult = Fitness.SessionsApi.insertSession (mGoogleApiClient, insertRequest); pendingResult.setResultCallback (neuer ResultCallback() @Override public void onResult (Statusstatus) if (status.isSuccess ()) Log.i ("Tuts +", "Erfolgreiche eingefügte laufende Sitzung");  else Log.i ("Tuts +", "Laufende Sitzung konnte nicht eingefügt werden:" + status.getStatusMessage ()); );

Sitzungsdaten lesen

Unabhängig davon, wie viele Sitzungsdaten Sie mit Ihrer App speichern, ist dies nur dann von Nutzen, wenn Sie diese Daten lesen und verwenden können, um Ihre App für Ihre Benutzer zu verbessern. Glücklicherweise ist es mit Google Fit unglaublich einfach, Sitzungsdaten innerhalb eines festgelegten Zeitraums zu erhalten.

Zuerst müssen Sie die Start- und Endzeit für die Daten auswählen, die Sie erhalten möchten. In diesem Beispiel fordern wir Sitzungsdaten für den letzten Monat an.

Kalender cal = Calendar.getInstance (); Datum jetzt = neues Datum (); cal.setTime (jetzt); long endTime = cal.getTimeInMillis (); cal.add (Calendar.MONTH, -1); long startTime = cal.getTimeInMillis ();

Nachdem Sie Ihr Zeitfenster ausgewählt haben, müssen Sie ein Fenster erstellen SessionReadRequest. Diese Anforderung umfasst das Zeitintervall für die gewünschten Sitzungsdaten, den Typ der Sitzungsdaten, nach denen Sie suchen (dieses Lernprogramm sucht nur nach Geschwindigkeitsdaten) und den Namen der angeforderten Sitzungen. Das Zeitintervall ist jedoch das nur erforderliche Eigenschaft.

SessionReadRequest readRequest = new SessionReadRequest.Builder () .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS) .read (DataType.TYPE_SPEED) .setSessionName (SESSION_NAME) .build (); PendingResult sessionReadResult = Fitness.SessionsApi.readSession (mGoogleApiClient, readRequest);

Nachdem du angerufen hast SitzungenApi.readSession, Sie erhalten eine SessionReadResult Objekt, das Listen von enthält Session und DataSet Objekte, die Sie in Ihrer App verwenden können. Für dieses Tutorial protokollieren wir einfach die Daten.

sessionReadResult.setResultCallback (neuer ResultCallback() @Override public void onResult (SessionReadResult sessionReadResult) if (sessionReadResult.getStatus (). IsSuccess ()) Log.i ("Tuts +", "Sitzungsdaten erfolgreich lesen"); for (Sitzung Sitzung: sessionReadResult.getSessions ()) Log.i ("Tuts +", "Sitzungsname:" + session.getName ()); für (DataSet dataSet: sessionReadResult.getDataSet (session)) für (DataPoint dataPoint: dataSet.getDataPoints ()) Log.i ("Tuts +", "Speed:" + "dataPoint.getValue" (Field.FIELD_SPEED));  else Log.i ("Tuts +", "Sitzungsdaten konnten nicht gelesen werden")); );

Wenn Sie Ihre Anwendung jetzt ausführen und die Einfüge- und Lesevorgänge verwenden, sollten Sie die drei Geschwindigkeiten erhalten Datenpunkt Objekte, die Sie im vorherigen Abschnitt erstellt haben.

I / Tuts +: Geschwindigkeit: 15,0 I / Tuts +: Geschwindigkeit: 5,0 I / Tuts +: Geschwindigkeit: 13,0

Sitzungsdaten löschen

Es kann vorkommen, dass Sie Sitzungsinformationen löschen müssen, die falsch oder nicht erforderlich sind. Verwenden Sie dazu die History-API, um Sitzungen zu löschen, die im Google Fit-Datenspeicher gespeichert wurden.

Zunächst müssen Sie ein Zeitintervall für den Löschvorgang festlegen. Sie können dann weitere Informationen hinzufügen, z Datentyp oder andere Session zu löschende Eigenschaften, oder Sie können einfach alle Sitzungsdaten innerhalb des Zeitintervalls löschen.

Kalender calendar = Calendar.getInstance (); Datum jetzt = neues Datum (); calendar.setTime (jetzt); long endTime = calendar.getTimeInMillis (); calendar.add (Calendar.DAY_OF_YEAR, -1); long startTime = calendar.getTimeInMillis (); DataDeleteRequest request = new DataDeleteRequest.Builder () .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS) .addDataType (DataType.TYPE_SPEED) .deleteAllSessions (); PendingResult deleteRequest = Fitness.HistoryApi.deleteData (mGoogleApiClient, Anforderung); deleteRequest.setResultCallback (neuer ResultCallback)() @Override public void onResult (@NonNull-Statusstatus) if (status.isSuccess ()) Log.i ("Tuts +", "Sitzungen erfolgreich gelöscht");  else Log.i ("Tuts +", "Sitzungen konnten nicht gelöscht werden"); );

Fazit

Wie Sie in diesem Lernprogramm erfahren haben, ist die Sessions-API ein leistungsfähiges Werkzeug zum Organisieren gesammelter Daten in Zeitblöcken. Es ist ein großes Kompliment an die anderen Google Fit-APIs. In Verbindung mit den Verlaufs- und Aufzeichnungs-APIs können Sie viel tun, um die Aktivität Ihrer App-Benutzer zu verstehen und ihnen ein hervorragendes Erlebnis mit Ihren Fitness-Apps zu bieten.