Google Fit este o platformă care permite dezvoltatorilor să construiască aplicații care se concentrează asupra datelor de fitness ale utilizatorilor. Unul dintre instrumentele pe care le-a oferit Google este Google Fit for Android, care este disponibil ca pachet în serviciile Google Play.
La începutul acestei serii, am explorat modul de stocare a datelor de fitness prin intermediul serviciilor Google Play folosind API-ul de înregistrare și modul de accesare și actualizare a datelor prin API-ul istoric. În acest tutorial, extindem aceste idei cu API-ul Sessions, care vă permite să organizați datele de activitate în intervale de timp.
Acest tutorial vă arată printr-un exemplu de proiect care demonstrează modul de lucru cu API-ul Sessions. Proiectul finit poate fi descărcat de la GitHub.
Pentru a utiliza Google Fit, trebuie să creați un ID client OAuth 2.0 și să înregistrați aplicația dvs. prin intermediul Consolei pentru dezvoltatori Google. Puteți găsi o explicație detaliată a modului de configurare a unui proiect în Consola pentru dezvoltatori Google din tutorialul meu despre API-ul Google Fit Sensors.
După ce aplicația dvs. este configurată pentru autentificare în Consola pentru dezvoltatori Google, utilizați numele pachetului pe care l-ați înregistrat pentru a crea o nouă aplicație Android cu o listă goală Activitate
.
Cu proiectul Android creat, deschideți build.gradle și includeți Servicii Google Play sub nodul de dependență și sincronizați aplicația. În această probă, folosesc și biblioteca cu cuțite de buton pentru a reduce codul plăcii cazanului pentru a asculta ascultătorii și a găsi Vedere
articole.
compile 'com.google.android.gms: play-services-fitness: 8.4.0' compile 'com.jakewharton: butterknife: 7.0.1'
Odată ce ați sincronizat dependențele, deschideți AndroidManifest.xml și să includă ACCESS_FINE_LOCATION
permisiune. Această permisiune este necesară pentru a citi datele despre sesiuni de la Google Fit. Deși nu intru în detalii în acest tutorial, merită menționat faptul că, dacă vizați API 23 sau o versiune superioară, trebuie să solicitați permisiunea de la utilizator.
În continuare, deschideți-vă activity_main.xml și să îl actualizați astfel încât să includă cinci Buton
elementele care vor fi folosite pentru a demonstra o parte din funcționalitatea API-ului Sessions. Rezultatul final ar trebui să arate similar cu următoarele:
Odată ce structura este creată, deschideți MainActivity.java și conectați-vă la serviciile Google Play.
clasa publica MainActivity se extinde AppCompatActivity implementeaza GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener string final privat SESSION_NAME = "nume sesiune"; GoogleApiClient privat mGoogleApiClient = null; sesiune privată mSession; @Override protejate void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); ButterKnife.bind (aceasta); mGoogleApiClient = noul GoogleApiClient.Builder (acest) .addApi (Fitness.SESSIONS_API) .addApi (Fitness.HISTORY_API) .addScope (Scopes.FITNESS_LOCATION_READ_WRITE) .addScope (Scopes.FITNESS_ACTIVITY_READ_WRITE) .addConnectionCallbacks .enableAutoManage (acest, 0, acest) .build (); @Override protejat void onDestroy () super.onDestroy (); ButterKnife.unbind (aceasta); @Override public void onConnected (Bundle Bundle) @Overide public void onConnectionSuspended (int i) @Override public void onConnectionFailed (@NonNull ConnectionResult connectionResult)
S-ar putea să fi observat că includeți API-ul Istoric împreună cu API-ul Sessions. Acest lucru este necesar deoarece istoricul API este folosit pentru ștergerea datelor sesiunii, pe care o vom discuta mai târziu în acest tutorial. De asemenea, trebuie să utilizați ambele FITNESS_LOCATION_READ_WRITE
și FITNESS_ACTIVITY_READ_WRITE
proprietăți de acoperire pentru funcțiile API pentru sesiunile pe care le vom discuta.
După ce ați setat aplicația pentru a vă conecta la Servicii Google Play și Google Fit, este timpul să începeți să încercați API-urile pentru sesiuni.
API-ul Sessions este un alt instrument de la Google Fit pentru stocarea datelor de fitness pentru utilizator. Ca atare, nu intenționează să înlocuiască API-urile de înregistrare sau de istoric, ci mai degrabă o modalitate suplimentară de îmbunătățire a aplicațiilor pentru o experiență mai bună a utilizatorului.
În această secțiune, învățați cum să începeți și să opriți colectarea datelor din sesiunea în timp real, cum să inserați o sesiune în magazinul de date Google Fit, cum să citiți datele de sesiune stocate anterior și cum să ștergeți sesiunile inutile sau incorecte. Similar cu API-ul Istoric, apelurile API pentru sesiuni trebuie să fie eliminate din firul principal. În timp ce tutorialul pentru istoricul API a înfășurat operațiunile AsyncTask
apeluri, acest tutorial se va concentra pe utilizarea PendingResult
apeluri rapide pentru a urmări sarcinile.
Cel mai frecvent scenariu pentru API-ul Sessions este înregistrarea informațiilor după ce un utilizator a inițiat o activitate de fitness. Acest lucru este adesea inițiat concomitent cu API-ul de înregistrare, astfel încât datele senzorilor să poată fi asociate cu intervalul de timp al sesiunii. Pentru a începe înregistrarea unei sesiuni, trebuie să creați un obiect de sesiune cu un nume, un identificator unic, o descriere, un timp de pornire și tipul de activitate pe care utilizatorul o efectuează.
mSession = new Session.Builder () .setName (SESSION_NAME) .setIdentifier (getString (R.string.app_name) + "" + System.currentTimeMillis ()) .setDescription (" ) .getTimeInMillis (), TimeUnit.MILLISECONDS). Setarea (FitnessActivities.YOGA) .build ();
Odată ce ai fost Sesiune
obiect este creat, puteți apela startSession
pe API-ul Sessions pentru a începe înregistrarea activității utilizatorului.
PendingResultpendingResult = Fitness.SessionsApi.startSession (mGoogleApiClient, mSession); pendingResult.setResultCallback (noul ResultCallback () @Override public void onResult (Stare stare) if (status.isSuccess ()) Log.i ("Tuts +", "Succesul a început sesiunea"); altceva Log.i ("Tuts +", "Succesul de a începe sesiunea:" + status.getStatusMessage ()); );
Când utilizatorul dvs. și-a terminat activitatea, puteți încheia sesiunea apelând stopSession
cu identificatorul unic pentru Sesiune
.
PendingResultpendingResult = Fitness.SessionsApi.stopSession (mGoogleApiClient, mSession.getIdentifier ()); pendingResult.setResultCallback (noul ResultCallback () @Override public void peResult (SessionStopResult sessionStopResult) if (sessionStopResult.getStatus () esteSuccess ()) Log.i ("Tuts +"; altceva Log.i ("Tuts +", "Nu a reușit să se oprească sesiunea:" + sessionStopResult.getStatus (). getStatusMessage ()); );
Ceva demn de remarcat aici este faptul că Sesiune
obiect implementează Parcelable
interfață, astfel încât acesta poate fi stocat într-un Pachet
în cazul în care trebuie să le stocați sau să le transferați către o altă componentă din cadrul aplicației. Acest lucru poate fi util dacă utilizatorul inițiază o activitate și apoi închide aplicația, deoarece este posibil să aveți nevoie ulterior de aceste date de sesiune pentru a opri înregistrarea sesiunii.
Acum, că știți cum să înregistrați informații despre sesiunile în timp real, următorul pas este să puteți introduce sesiuni ulterioare. În timp ce puteți introduce un bloc de timp ca sesiune, API-ul Sessions vă permite, de asemenea, să asociați activitățile cu segmentele unei sesiuni. Acest lucru este util în situațiile în care utilizatorul nu poate desfășura în mod continuu aceeași activitate în întreaga sa rutină de fitness.
Un exemplu poate fi atunci când aplicația dvs. a detectat că utilizatorul a alergat, sa odihnit pentru o scurtă perioadă de mers, și apoi a alergat din nou. În exemplul următor, introduceți a Sesiune
unde utilizatorul a alergat timp de 15 minute, a mers pe jos timp de cinci minute și apoi a alergat timp de încă 15 minute urmărind când utilizatorul a început și a oprit fiecare activitate. De asemenea, înregistrați viteza medie pentru fiecare dintre aceste activități.
Calendar calendar = Calendar.getInstance (); Data acum = data nouă (); calendar.setTime (acum); lungul endTime = calendar.getTimeInMillis (); calendar.add (Calendar.MINUTE, -15); lungime WalkEndTime = calendar.getTimeInMillis (); calendar.add (Calendar.MINUTE, -5); lungul walkStartTime = calendar.getTimeInMillis (); calendar.add (Calendar.MINUTE, -15); lungul startTime = calendar.getTimeInMillis (); float firstRunSpeed = 15; float walkSpeed = 5; float secondRunSpeed = 13;
Odată ce aveți valorile cheie de timp și de viteză, trebuie să creați două DataSet
grupuri pentru stocarea informațiilor despre activități și viteză. Acestea pot fi create dintr-un set de Sursă de date
obiecte potrivite DataType
set de proprietăți.
DataSource speedSegmentDataSource = nou DataSource.Builder () .setAppPackageName (this.getPackageName ()) .setDataType (DataType.TYPE_SPEED) .setName (setul de date Tuts + viteză) .setType (DataSource.TYPE_RAW) .build (); DataSource activitySegmentDataSource = nou DataSource.Builder () .setAppPackageName (this.getPackageName ()) .setDataType (DataType.TYPE_ACTIVITY_SEGMENT) .setName (setul de date "Tuts + segmentele de activitate") .setType (DataSource.TYPE_RAW) .build (); DataSet vitezăDataSet = DataSet.create (vitezăSegmentDataSource); Activitatea DataSetDataSet = DataSet.create (activitySegmentDataSource);
Apoi, trebuie să creați DataPoint
obiecte care vor fi inserate în magazinul de date Google Fit. Fiecare DataPoint
are un interval de timp și un set de Camp
proprietati care stocheaza date corelate. Odată ce fiecare DataPoint
este configurat, trebuie să-l introduceți în mod corespunzător DataSet
. Pentru brevet, am afișat doar fragmentul de cod pentru crearea DataPoint
obiecte pentru primul segment de execuție de mai jos, deși celelalte obiecte de punct de date sunt afișate în codul sursă pentru acest tutorial pe GitHub.
// Crearea punctului de date de viteză pentru primul segment de rulare DataPoint firstRunSpeedDataPoint = speedDataSet.createDataPoint () .setTimeInterval (startTime, walkStartTime, TimeUnit.MILLISECONDS); firstRunSpeedDataPoint.getValue (Field.FIELD_SPEED) .setFloat (firstRunSpeed); speedDataSet.add (firstRunSpeedDataPoint); // Crearea punctului de date de activitate pentru al doilea segment de rulare DataPoint secondRunActivityDataPoint = activityDataSet.createDataPoint () .setTimeInterval (walkEndTime, endTime, TimeUnit.MILLISECONDS); secondRunActivityDataPoint.getValue (Field.FIELD_ACTIVITY) .setActivity (FitnessActivities.RUNNING); activityDataSet.add (secondRunActivityDataPoint);
Odată ce ați populat cele două DataSet
grupuri, este timpul să creați Sesiune
pe care îl veți insera. Acest Sesiune
va trebui să setați numele, identificatorul unic, descrierea, timpul de începere și sfârșit și proprietățile activității. Un lucru important pentru a fi conștient este că numele pe care îl utilizați când introduceți a Sesiune
este numele pe care trebuie să-l utilizați atunci când încercați să citiți mai târziu această sesiune.
Session session = new Session.Builder () .setName (SESSION_NAME) .setIdentifier (getString (R.string.app_name) + "" + System.currentTimeMillis ()) .setDescription ("Running in Segments" .MILLISECONDS) .setEndTime (endTime, TimeUnit.MILLISECONDS) .setActivitate (FitnessActivities.RUNNING) .build ();
Acum, că dvs. Sesiune
este creat, trebuie să creați o SessionInsertRequest
, adăugați-vă DataSet
obiecte la ea, și apoi introduceți asta Sesiune
în Google Fit.
SessionInsertRequest insertRequest = nou SessionInsertRequest.Builder () .setSession (sesiune) .addDataSet (speedDataSet) .addDataSet (activityDataSet) .build (); PendingResultpendingResult = Sesiuni de fitness.SpițieApi.insertSession (mGoogleApiClient, insertRequest); pendingResult.setResultCallback (noul ResultCallback () @Override public void onResult (Stare stare) if (status.isSuccess ()) Log.i ("Tuts +", sesiune de alertă introdusă cu succes); altceva Log.i ("Tuts +", "Nu a reușit inserarea sesiunii de rulare:" + status.getStatusMessage ()); );
Indiferent de numărul de date de sesiune pe care le stocați cu aplicația dvs., nu vă va face prea bine decât dacă veți putea să citiți aceste date și să le utilizați pentru a îmbunătăți aplicația pentru utilizatorii dvs. Din fericire, Google Fit face incredibil de ușor să primească date de sesiune într-un interval de timp stabilit.
În primul rând, trebuie să selectați ora de începere și de sfârșit pentru datele pe care doriți să le primiți. În acest exemplu, solicităm datele din sesiune pentru ultima lună.
Calendarul cal = Calendar.getInstance (); Data acum = data nouă (); cal.setTime (acum); lungul endTime = cal.getTimeInMillis (); cal.add (Calendar.MONTH, -1); long startTime = cal.getTimeInMillis ();
Odată ce ați selectat fereastra de timp, trebuie să creați o SessionReadRequest
. Această solicitare include intervalul de timp pentru datele de sesiune dorite, tipul de date de sesiune pe care îl căutați (acest tutorial va căuta numai date de viteză) și numele sesiunilor pe care le cereți, deși intervalul de timp este numai bunurile necesare.
SessionReadRequest readRequest = nou SessionReadRequest.Builder () .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS) .read (DataType.TYPE_SPEED) .setSessionName (SESSION_NAME) .build (); PendingResultsessionReadResult = Fitness.SessionsApi.readSession (mGoogleApiClient, readRequest);
După ce ați sunat SessionsApi.readSession
, primiți a SessionReadResult
obiect care conține liste de Sesiune
și DataSet
obiecte pe care le puteți utiliza în aplicația dvs. Pentru acest tutorial, pur și simplu logăm datele.
sessionReadResult.setResultCallback (noul ResultCallback() @Override public void peResult (SessionReadResult sessionReadResult) if (sessionReadResult.getStatus () esteSuccess ()) Log.i ("Tuts +", citirea cu succes a datelor din sesiune); pentru (Sesiunea sesiunii: sessionReadResult.getSessions ()) Log.i ("Tuts +", "Session name:" + session.getName ()); pentru (DataSet dataSet: sessionReadResult.getDataSet (sesiune)) pentru (DataPoint dataPoint: dataSet.getDataPoints ()) Log.i ("Tuts +", "Speed:" + dataPoint.getValue (Field.FIELD_SPEED)); altceva Log.i ("Tuts +", "Citește datele despre sesiune"); );
Dacă rulați acum aplicația dvs. și utilizați operațiile de inserare și citire, trebuie să primiți cele trei viteze DataPoint
obiecte pe care le-ați creat în secțiunea anterioară.
I / Tuts +: Viteză: 15.0 I / Tuts +: Viteză: 5.0 I / Tuts +: Viteză: 13.0
Pot exista momente în care trebuie să ștergeți unele informații despre sesiune care sunt fie incorecte, fie inutile. Acest lucru se poate face utilizând API-ul Istoric pentru a șterge sesiunile care au fost salvate în magazinul de date Google Fit.
În primul rând, trebuie să determinați un interval de timp pentru operația de ștergere. Puteți adăuga apoi informații suplimentare, cum ar fi a DataType
sau altul Sesiune
să ștergeți proprietățile sau să ștergeți pur și simplu toate datele sesiunii în intervalul de timp.
Calendar calendar = Calendar.getInstance (); Data acum = data nouă (); calendar.setTime (acum); lungul endTime = calendar.getTimeInMillis (); calendar.add (Calendar.DAY_OF_YEAR, -1); lungul startTime = calendar.getTimeInMillis (); Cererea DataDeleteRequest = noua DataDeleteRequest.Builder () .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS) .addDataType (DataType.TYPE_SPEED) .deleteAllSessions () .build (); PendingResultdeleteRequest = Fitness.HistoryApi.deleteData (mGoogleApiClient, cerere); deleteRequest.setResultCallback (noul ResultCallback () @Override public void onResult (@NonNull Stare stare) if (status.isSuccess ()) Log.i ("Tuts +", Sesiuni șterse cu succes); altceva Log.i ("Tuts +", "Eroare la ștergerea sesiunilor"); );
După cum ați învățat în acest tutorial, API-ul Sessions este un instrument puternic pentru organizarea datelor colectate în blocuri de timp. Acesta este un compliment excelent pentru celelalte interfețe Google Fit API. Când este utilizat împreună cu API-ul History and Recording, puteți face multe pentru a înțelege activitatea utilizatorilor aplicației dvs. și a le oferi o experiență excelentă cu aplicațiile de fitness.