Google Fit is een platform waarmee ontwikkelaars applicaties kunnen bouwen die zijn gericht op gebruikersfitnessgegevens. Een van de hulpmiddelen die Google heeft geboden, is Google Fit voor Android, dat beschikbaar is als pakket in Google Play-services.
Eerder in deze reeks hebben we onderzocht hoe fitnessgegevens kunnen worden opgeslagen via Google Play-services met behulp van de opname-API en hoe toegang te krijgen tot en gegevens bij te werken via de geschiedenis-API. In deze zelfstudie breiden we deze ideeën uit met de Sessions API, waarmee u activiteitsgegevens kunt indelen op basis van tijdsintervallen.
In deze zelfstudie doorloopt u een voorbeeldproject dat laat zien hoe u met de Sessions API kunt werken. Het voltooide project kan worden gedownload van GitHub.
Als u Google Fit wilt gebruiken, moet u een OAuth 2.0-client-ID maken en uw toepassing registreren via de Google-ontwikkelaarsconsole. U vindt een gedetailleerde uitleg over het instellen van een project in de Google Developer Console in mijn zelfstudie over de Google Fit Sensors API.
Zodra uw toepassing is geconfigureerd voor verificatie in de Google-ontwikkelaarsconsole, gebruikt u de pakketnaam die u heeft geregistreerd om een nieuwe Android-toepassing te maken met een lege Activiteit
.
Met het Android-project gemaakt, open build.gradle en Google Play-services opnemen onder het knooppunt afhankelijkheden en uw app synchroniseren. In dit voorbeeld gebruik ik ook de Butter Knife-bibliotheek om ketelplaatcode voor luisteraars van klikken en vinden te verminderen Uitzicht
items.
compileren 'com.google.android.gms: play-services-fitness: 8.4.0' compile 'com.jakewharton: butterknife: 7.0.1'
Zodra je je afhankelijkheden hebt gesynchroniseerd, open je AndroidManifest.xml en neem de ACCESS_FINE_LOCATION
toestemming. Deze toestemming is vereist om sessiegegevens van Google Fit te kunnen lezen. Hoewel ik in deze zelfstudie niet in detail inga, is het de moeite waard om op te merken dat als u API 23 of hoger target, u de locatietoestemming van de gebruiker moet aanvragen.
Open vervolgens activity_main.xml en werk het bij zodat het er vijf bevat Knop
items die zullen worden gebruikt om een deel van de functionaliteit van de Sessions API te demonstreren. Het eindresultaat zou er ongeveer zo uit moeten zien te zien:
Nadat de lay-out is gemaakt, opent u MainActivity.java en maak verbinding met Google Play-services.
openbare klasse MainActivity breidt AppCompatActivity implementeert GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener private finale String SESSION_NAME = "sessienaam"; privé GoogleApiClient mGoogleApiClient = null; privé sessiesessie; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); ButterKnife.bind (deze); mGoogleApiClient = nieuwe GoogleApiClient.Builder (dit) .addApi (Fitness.SESSIONS_API) .addApi (Fitness.HISTORY_API) .addScope (nieuwe scope (Scopes.FITNESS_LOCATION_READ_WRITE)) .addScope (nieuwe scope (Scopes.FITNESS_ACTIVITY_READ_WRITE)) .addConnectionCallbacks (this) .enableAutoManage (this, 0, this) .build (); @Override beschermde leegte onDestroy () super.onDestroy (); ButterKnife.unbind (deze); @Override public void onConnected (bundelbundel) @Override openbare ongeldig onConnectionSuspended (int i) @Override openbare ongeldig onConnectionFailed (@NonNull ConnectionResult connectionResult)
U hebt misschien gemerkt dat u de geschiedenis-API toevoegt, samen met de Sessions API. Dit is nodig omdat de geschiedenis-API wordt gebruikt voor het verwijderen van sessiegegevens, die we later in deze zelfstudie zullen bespreken. U moet ook beide gebruiken FITNESS_LOCATION_READ_WRITE
en FITNESS_ACTIVITY_READ_WRITE
scope-eigenschappen voor de Sessions API-functies die we zullen bespreken.
Nadat u uw app heeft ingesteld om verbinding te maken met Google Play-services en Google Fit, is het tijd om de Sessions API uit te proberen.
De Sessions API is een ander hulpmiddel van Google Fit voor het opslaan van fitnessgegevens voor de gebruiker. Als zodanig is het niet bedoeld als vervanging voor de opname- of geschiedenis-API's, maar is het eerder een extra manier om uw apps te verbeteren voor een betere gebruikerservaring.
In dit gedeelte leert u hoe u realtime gegevensverzameling van sessies start en stopt, hoe u een sessie in de Google Fit-gegevensopslag invoegt, hoe eerder opgeslagen sessiegegevens worden gelezen en hoe onnodige of onjuiste sessies worden verwijderd. Net als bij de API voor geschiedenis, moeten Sessions API-aanroepen van de hoofdthread worden gemaakt. Terwijl de zelfstudie voor de geschiedenis-API ingepakte bewerkingen bevat AsyncTask
oproepen, deze tutorial zal zich concentreren op het gebruik van PendingResult
callbacks om taken bij te houden.
Het meest voorkomende scenario voor de Sessions API is het vastleggen van informatie nadat een gebruiker een fitnessactiviteit heeft gestart. Dit wordt vaak gelijktijdig met de opname-API gestart, zodat sensorgegevens kunnen worden gekoppeld aan het sessietijdschema. Als u een sessie wilt opnemen, moet u een sessieobject maken met een naam, een unieke ID, een beschrijving, een begintijd en het type activiteit dat de gebruiker uitvoert.
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 ();
Zodra je Sessie
object is gemaakt, kunt u bellen startSession
op de Sessions API om de activiteit van uw gebruiker te registreren.
PendingResultpendingResult = Fitness.SessionsApi.startSession (mGoogleApiClient, mSession); pendingResult.setResultCallback (new ResultCallback () @Override public unfid onResult (Status status) if (status.isSuccess ()) Log.i ("Tuts +", "Successfully started session"); else Log.i ("Tuts +", "Kan sessie niet starten:" + status.getStatusMessage ()); );
Wanneer uw gebruiker zijn activiteit heeft beëindigd, kunt u de sessie beëindigen door te bellen stopSession
met de unieke ID voor de Sessie
.
PendingResultpendingResult = Fitness.SessionsApi.stopSession (mGoogleApiClient, mSession.getIdentifier ()); pendingResult.setResultCallback (new ResultCallback () @Override public void onResult (SessionStopResult sessionStopResult) if (sessionStopResult.getStatus (). IsSuccess ()) Log.i ("Tuts +", "Successfully stop session"); else Log.i ("Tuts +", "Failed to stop session:" + sessionStopResult.getStatus (). getStatusMessage ()); );
Iets dat het vermelden waard is, is dat het Sessie
object implementeert de Parcelable
interface, zodat het kan worden opgeslagen in een Bundel
voor het geval u het moet opslaan of doorgeven aan een ander onderdeel binnen uw applicatie. Dit kan handig zijn als de gebruiker een activiteit start en vervolgens de app sluit, omdat u die sessiegegevens mogelijk later nodig hebt om de opname van de sessie te stoppen..
Nu u weet hoe u realtime sessie-informatie kunt vastleggen, is de volgende stap het feit dat u sessies achteraf kunt invoegen. Hoewel u een blok van tijd als sessie kunt invoegen, kunt u met de Sessions API ook activiteiten aan segmenten van een sessie koppelen. Dit is handig voor situaties waarbij de gebruiker niet voortdurend dezelfde activiteit doet gedurende zijn gehele fitnessroutine.
Een voorbeeld hiervan is wanneer uw app heeft gedetecteerd dat de gebruiker rende, even rustte door te lopen en vervolgens opnieuw rende. In het volgende voorbeeld voegt u een Sessie
waar de gebruiker 15 minuten rende, vijf keer liep en vervolgens nog eens 15 minuten rende door bij te houden wanneer de gebruiker elke activiteit startte en stopte. Je noteert ook hun gemiddelde snelheid voor elk van die activiteiten.
Kalenderkalender = Calendar.getInstance (); Datum nu = nieuwe datum (); calendar.setTime (nu); long endTime = calendar.getTimeInMillis (); calendar.add (Calendar.MINUTE, -15); longwalkEndTime = calendar.getTimeInMillis (); calendar.add (Calendar.MINUTE, -5); longwalkStartTime = calendar.getTimeInMillis (); calendar.add (Calendar.MINUTE, -15); long startTime = calendar.getTimeInMillis (); float firstRunSpeed = 15; float walkSpeed = 5; zweven secondRunSpeed = 13;
Zodra u de belangrijkste tijd- en snelheidswaarden hebt, moet u er twee maken DataSet
groepen voor het opslaan van informatie over activiteiten en snelheid. Deze kunnen worden gemaakt op basis van een set Databron
objecten met de juiste Data type
eigenschappen ingesteld.
DataSource speedSegmentDataSource = new DataSource.Builder () .setAppPackageName (this.getPackageName ()) .setDataType (DataType.TYPE_SPEED) .setName ("Tuts + speed dataset") .setType (DataSource.TYPE_RAW) .build (); DataSource-activiteitSegmentDataSource = new DataSource.Builder () .setAppPackageName (this.getPackageName ()) .setDataType (DataType.TYPE_ACTIVITY_SEGMENT) .setName ("Tuts + datasegmenten activiteitssegmenten") .setType (DataSource.TYPE_RAW) .build (); DataSet speedDataSet = DataSet.create (speedSegmentDataSource); DataSet activityDataSet = DataSet.create (activitySegmentDataSource);
Vervolgens moet u het maken Data punt
objecten die in de Google Fit-gegevensopslag worden ingevoegd. Elk Data punt
heeft een tijdsinterval en een set van Veld
eigenschappen die gerelateerde gegevens opslaan. Een keer per stuk Data punt
is geconfigureerd, moet u deze in de juiste invoegen DataSet
. Kortheidshalve laat ik alleen het codefragment zien voor het maken Data punt
objecten voor het eerste loopsegment hieronder, hoewel de andere datapuntobjecten worden getoond in de broncode voor deze tutorial op GitHub.
// Snelheidspunt voor eerste loopsegment maken DataPoint firstRunSpeedDataPoint = speedDataSet.createDataPoint () .setTimeInterval (startTime, walkStartTime, TimeUnit.MILLISECONDS); firstRunSpeedDataPoint.getValue (Field.FIELD_SPEED) .setFloat (firstRunSpeed); speedDataSet.add (firstRunSpeedDataPoint); // Activiteitsgegevenspunt maken voor tweede loopsegment DataPoint secondRunActivityDataPoint = activityDataSet.createDataPoint () .setTimeInterval (walkEndTime, EndTime, TimeUnit.MILLISECONDS); secondRunActivityDataPoint.getValue (Field.FIELD_ACTIVITY) .setActivity (FitnessActivities.RUNNING); activityDataSet.add (secondRunActivityDataPoint);
Zodra je de twee hebt bevolkt DataSet
groepen, het is tijd om het te maken Sessie
die je invoegt. Deze Sessie
moet de naam, unieke ID, beschrijving, start- en eindtijden en activiteitseigenschappen instellen. Een belangrijk ding om op te letten is dat de naam die u gebruikt bij het invoegen van een Sessie
is de naam die u moet gebruiken bij een poging om deze sessie later te lezen.
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 ();
Nu dat van jou Sessie
is gemaakt, moet u een maken SessionInsertRequest
, Voeg uw ... toe DataSet
objecten en voeg dat toe Sessie
in Google Fit.
SessionInsertRequest insertRequest = new SessionInsertRequest.Builder () .setSession (session) .addDataSet (speedDataSet) .addDataSet (activityDataSet) .build (); PendingResultpendingResult = Fitness.SessionsApi.insertSession (mGoogleApiClient, insertRequest); pendingResult.setResultCallback (new ResultCallback () @Override public void onResult (Statusstatus) if (status.isSuccess ()) Log.i ("Tuts +", "succesvol ingevoegde hardloop sessie"); else Log.i ("Tuts +", "Actieve sessie niet invoegen:" + status.getStatusMessage ()); );
Ongeacht hoeveel sessiegegevens u opslaat met uw app, het zal u niet veel goed doen, tenzij u die gegevens kunt lezen en gebruiken om uw app beter te maken voor uw gebruikers. Gelukkig maakt Google Fit het ongelooflijk gemakkelijk om sessiegegevens binnen een bepaald tijdsbestek te ontvangen.
Eerst moet u de begin- en eindtijd selecteren voor de gegevens die u wilt ontvangen. In dit voorbeeld vragen we sessiegegevens voor de afgelopen maand.
Kalender cal = Calendar.getInstance (); Datum nu = nieuwe datum (); cal.setTime (nu); long endTime = cal.getTimeInMillis (); cal.add (Calendar.MONTH, -1); long startTime = cal.getTimeInMillis ();
Zodra je je tijdvenster hebt geselecteerd, moet je een SessionReadRequest
. Dit verzoek bevat het tijdsinterval voor uw gewenste sessiegegevens, het type sessiegegevens dat u zoekt (in deze zelfstudie worden alleen snelheidsgegevens gezocht) en de naam van de sessies die u opvraagt, maar het tijdsinterval is de alleen vereist eigendom.
SessionReadRequest readRequest = new SessionReadRequest.Builder () .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS) .read (DataType.TYPE_SPEED) .setSessionName (SESSION_NAME) .build (); PendingResultsessionReadResult = Fitness.SessionsApi.readSession (mGoogleApiClient, readRequest);
Nadat je gebeld hebt SessionsApi.readSession
, je ontvangt een SessionReadResult
object dat lijsten bevat van Sessie
en DataSet
objecten die u in uw app kunt gebruiken. Voor deze zelfstudie loggen we eenvoudig de gegevens in.
sessionReadResult.setResultCallback (new ResultCallback() @Override public unfid onResult (SessionReadResult sessionReadResult) if (sessionReadResult.getStatus (). IsSuccess ()) Log.i ("Tuts +", "Successed session-gegevens lezen"); for (Session session: sessionReadResult.getSessions ()) Log.i ("Tuts +", "Session name:" + session.getName ()); for (DataSet dataSet: sessionReadResult.getDataSet (session)) for (DataPoint dataPoint: dataSet.getDataPoints ()) Log.i ("Tuts +", "Speed:" + dataPoint.getValue (Field.FIELD_SPEED)); else Log.i ("Tuts +", "Kan sessiedata niet lezen"); );
Als u uw toepassing nu uitvoert en de invoeg- en leesbewerkingen gebruikt, zou u de drie snelheden moeten ontvangen Data punt
objecten die u in het vorige gedeelte hebt gemaakt.
I / Tuts +: Snelheid: 15.0 I / Tuts +: Snelheid: 5.0 I / Tuts +: Snelheid: 13.0
Het kan voorkomen dat u sommige sessie-informatie die onjuist of niet nodig is, moet verwijderen. Dit kan worden gedaan door de History API te gebruiken om sessies te verwijderen die zijn opgeslagen in de Google Fit-gegevensopslag.
Eerst moet u een tijdsinterval bepalen voor de wisbewerking. U kunt dan aanvullende informatie toevoegen, zoals a Data type
of andere Sessie
eigenschappen om te verwijderen, of u kunt eenvoudig alle sessiegegevens verwijderen binnen het tijdsinterval.
Kalenderkalender = Calendar.getInstance (); Datum nu = nieuwe datum (); calendar.setTime (nu); 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 () .build (); PendingResultdeleteRequest = Fitness.HistoryApi.deleteData (mGoogleApiClient, request); deleteRequest.setResultCallback (nieuwe ResultCallback () @Override public void onResult (@NonNull Status-status) if (status.isSuccess ()) Log.i ("Tuts +", "Sites met succes verwijderd"); else Log.i ("Tuts +", "Verwijderen van sessies mislukt"); );
Zoals u in deze tutorial hebt geleerd, is de Sessions API een krachtige tool voor het organiseren van verzamelde gegevens in blokken van tijd. Het is een groot compliment voor de andere Google Fit API's. Bij gebruik in combinatie met de API's voor geschiedenis en vastleggen, kunt u de activiteiten van de gebruikers van uw app veel beter begrijpen en hen uitstekende ervaringen met uw fitness-apps bieden..