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.
Într-un tutorial anterior, am explorat modul de utilizare a API-ului Google Fit Recording pentru a stoca date de fitness prin intermediul serviciilor Google Play. Acest tutorial se extinde pe subiect prin explorarea modului de accesare și actualizare a datelor stocate în Google Fit utilizând API-ul Istoric.
Ceea ce face ca Google Fit să fie puternic este faptul că datele de fitness sunt stocate prin Google Cloud Services, ceea ce permite accesul și analiza ulterioară. În timp ce API-urile senzorilor și înregistrărilor se concentrează pe colectarea datelor de fitness de pe un dispozitiv Android, istoricul API este destinat să ofere dezvoltatorilor un acces ușor la datele stocate.
Acest tutorial vă oferă un exemplu de proiect care demonstrează cum să lucrați cu API-ul History. Produsul 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 un SDK minim de 9 și un pachet gol Activitate
.
Cu baza aplicației Android creată, deschideți build.gradle și includeți Servicii Google Play sub nodul de dependență și sincronizați aplicația.
compile 'com.google.android.gms: play-services-fitness: 8.4.0'
Acum ar trebui să puteți include în aplicația dvs. clasele serviciilor Google Play necesare. Înainte de a ne scufunda în codul Java pentru acest tutorial, deschideți-l activity_main.xml și modificați-o astfel încât să includă cinci Buton
elemente pe care le vom folosi pentru a demonstra unele dintre funcționalitățile API-ului Istoric.
Când executați aplicația, interfața de utilizator ar trebui să arate astfel:
Pentru a continua configurarea proiectului, deschideți-l MainActivity.java și să pună în aplicare următoarele apeluri înapoi și metode necesare:
GoogleApiClient.ConnectionCallbacks
GoogleAPiClient.OnConnectionFailedListener
View.OnClickListener
De asemenea, trebuie să adăugați o variabilă membru pentru GoogleApiClient
și un set de referințe la dvs. Buton
obiecte, după cum se arată mai jos.
public class MainActivity se extinde AppCompatActivity implementează GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, View.OnClickListener butonul privat mButtonViewWeek; butonul privat mButtonViewToday; butonul privat mButtonAddSteps; butonul privat mButtonUpdateSteps; butonul privat mButtonDeleteSteps; GoogleApiClient privat mGoogleApiClient; @Override protejate void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); mButtonViewWeek = (buton) findViewById (R.id.btn_view_week); mButtonViewToday = (buton) findViewById (R.id.btn_view_today); mButtonAddSteps = (buton) findViewById (R.id.btn_add_steps); mButtonUpdateSteps = (buton) findViewById (R.id.btn_update_steps); mButtonDeleteSteps = (buton) findViewById (R.id.btn_delete_steps); mButtonViewWeek.setOnClickListener (aceasta); mButtonViewToday.setOnClickListener (aceasta); mButtonAddSteps.setOnClickListener (aceasta); mButtonUpdateSteps.setOnClickListener (aceasta); mButtonDeleteSteps.setOnClickListener (aceasta); @Override publice void onConnectionSuspended (int i) Log.e ("HistoryAPI", "onConnectionSuspended"); @Override publice void onConnectionFailed (@NonNull ConnectionResult connectionResult) Log.e ("HistoryAPI", "onConnectionFailed"); public void onConnected (@ pachet Nullable Bundle) Log.e ("HistoryAPI", "onConnected"); @Override public void onClick (Vizualizare v)
Ultimul lucru pe care trebuie să-l faceți pentru a configura proiectul dvs. de eșantion este să vă conectați la serviciile Google Play. Acest lucru se poate face la sfârșitul anului onCreate ()
metodă.
mGoogleApiClient = nou GoogleApiClient.Builder (acest) .addApi (Fitness.HISTORY_API) .addScope (nou Scop (Scopes.FITNESS_ACTIVITY_READ_WRITE)) .addConnectionCallbacks (acest) .enableAutoManage (this, 0, this) .build ();
Cu codul de mai sus, ne conectăm la serviciile Google Play și solicităm acces la API-ul Istoric în Google Fit, precum și permisiunea de a citi și scrie date despre activitate. Prin adăugarea enableAutoManage
, serviciile Google Play gestionează conectarea și deconectarea corectă.
Cu ajutorul API-ului Istoric, puteți prelua și agrega date, puteți introduce valori pe care le-ați adunat în aplicație sau puteți șterge datele care pot fi stocate. Un lucru important este să rețineți că toate operațiile API Istoric din acest tutorial trebuie să se facă de pe firul principal. Cu alte cuvinte, fiecare operațiune are loc într-un an AsyncTask
:
clasa privată ViewWeekStepCountTask extinde AsyncTaskvoid protejat doInBackground (Void ... params) displayLastWeeksData (); retur nul;
O singură sarcină pe care doriți să o faceți este să utilizați sau să afișați date care au fost colectate în timp. Puteți face acest lucru prin crearea unui nou DataReadRequest
pentru un anumit tip de date care se potrivește unor parametri de interogare.
Puteți grupa aceste date împreună Găleată
obiecte în funcție de timp sau de sesiuni. Pentru acest exemplu, solicitați date treptate agregate pentru ultima săptămână și cuplați datele respective în fiecare zi.
Calendarul cal = Calendar.getInstance (); Data acum = data nouă (); cal.setTime (acum); lungul endTime = cal.getTimeInMillis (); cal.add (Calendar.WEEK_OF_YEAR, -1); long startTime = cal.getTimeInMillis (); java.text.DateFormat dataFormat = DateFormat.getDateInstance (); Log.e ("Istoric", "Start Range:" + dateFormat.format (startTime)); Log.e ("Istoric", "Sfârșit de domeniu:" + dateFormat.format (endTime)); // Verificați câți pași au fost înregistrați în ultimele 7 zile DataReadRequest readRequest = new DataReadRequest.Builder () .aggregate (DataType.TYPE_STEP_COUNT_DELTA, DataType.AGGREGATE_STEP_COUNT_DELTA) .bucketByTime (1, TimeUnit.DAYS) .setTimeRange (startTime, endTime , TimeUnit.MILLISECONDS) .build ();
Odată ce ai DataReadRequest
create, puteți solicita date de la GoogleApiClient
folosind Fitness.HistoryApi.readData
comanda. De asemenea, sunați aștepta
pe clientul API, astfel încât firul să se oprească timp de până la un minut în timp ce așteaptă interogarea. Dacă ceva nu merge bine, firul continuă după acel minut.
DataReadResult dataReadResult = Fitness.HistoryApi.readData (mGoogleApiClient, readRequest) .auit (1, TimeUnit.MINUTES);
Dacă apelul revine cu succes, puteți accesa datele de fitness ale utilizatorului din DataReadResult
obiect. Solicitarea datelor pasului dvs. este returnată în Găleată
obiecte, deși alte tipuri de date sunt returnate ca a Listă
de DataSet
obiecte. În funcție de tipul de date returnate, îl puteți accesa cu următorul cod:
// Utilizat pentru datele agregate dacă (dataReadResult.getBuckets () .mări ()> 0) Log.e ("Istoric", "Numărul de coșuri:" + dataReadResult.getBuckets (). pentru (Bucket bucket: dataReadResult.getBuckets ()) ListădateSets = bucket.getDataSets (); pentru (DateSet dataSet: dataSets) showDataSet (dataSet); // Utilizat pentru date neagregate altceva dacă (dataReadResult.getDataSets () .mări ()> 0) Log.e ("Istoric", Număr de seturi de date returnate: "+ dataReadResult.getDataSets () ()); pentru (DataSet dataSet: dataReadResult.getDataSets ()) showDataSet (dataSet);
Apoi, puteți recupera fiecare DataPoint
de la DataSet
obiecte care au fost returnate.
private void showDataSet (DataSet dataSet) Log.e ("Istoric", "Date returnate pentru tipul de date:" + dataSet.getDataType (). getName ()); DataFormat dateFormat = DateFormat.getDateInstance (); DateFormat timeFormat = DateFormat.getTimeInstance (); pentru (DataPoint dp: dataSet.getDataPoints ()) Log.e ("Istoric", "Punct de date:"); Log.e ("Istoric", "\ tType:" + dp.getDataType (). GetName ()); Log.e ("Istoric", "\ tStart:" + dateFormat.format (dp.getStartTime (TimeUnit.MILLISECONDS)) + "" + timeFormat.format (dp.getStartTime (TimeUnit.MILLISECONDS)); Log.e ("Istoric", "\ tEnd:" + dateFormat.format (dp.getEndTime (TimeUnit.MILLISECONDS)) + "" + timeFormat.format (dp.getStartTime (TimeUnit.MILLISECONDS)); pentru câmpul câmpului: dp.getDataType () getFields ()) Log.e ("Istorie", "\ tField:" + field.getName () + "Valoare:" + dp.getValue (câmp));
Dacă o aplicație de pe dispozitivul utilizatorului a activat API-ul de înregistrare în ultima săptămână, atunci primiți date pentru fiecare zi în care a fost activă. Jurnalele de la codul de mai sus ar trebui să arate asemănător cu aceasta:
E / Istorie: Gama Start: Feb 17, 2016 E / Istorie: Sfarsit Range: Feb 24, 2016 E / Istoric: Numar de galeti: 7 E / Istoric: Date returnate pentru Tipul de date: com.google.step_count.delta E / Istoric: Punct de date: E / Istoric: Tip: com.google.step_count.delta E / Istoric: Start: 17 februarie 2016 11:01:46 PM E / Istorie: Sfârșit: 17 februarie 2016 11:01:46 E / Istorie: Câmp: pași Valoare: 9360 E / Istoric: Datele returnate pentru Tipul de date: com.google.step_count.delta E / Istoric: Datele returnate pentru tipul de date: com.google.step_count.delta E / Istoric: pentru Tipul de date: com.google.step_count.delta E / Istorie: Punctul de date: E / Istoric: Tip: com.google.step_count.delta E / Istoric: Start: 21 februarie 2016 9:58:03 E / Istorie : Sfârșit: 21 februarie 2016 9:58:03 E / Istorie: Câmp: pași Valoare: 10041 E / Istoric: Datele returnate pentru Tipul de date: com.google.step_count.delta E / Istorie: Data punctului: E / Istoric : Tip: com.google.step_count.delta E / Istorie: Start: Feb 21, 2016 11:22:53 E / Istorie: Sfârșit: 22 februarie 2016 11:22:53 E / Istorie: Câmp: pași Valoare : 10786 E / Istoric: Datele returnate pentru Tipul de date: com.google.step_count.delta E / Istorie: Punctul de date: E / Istoric: Tip: com.google.step_count.delta E / Istoric: Start: Feb 22, 2016 11 : 06:31 E / Istorie: Sfârșit: 23 februarie 2016 11:06:31 E / Istorie: Câmp: pași Valoare: 13099 E / Istoric: Datele returnate pentru Tipul de date: com.google.step_count.delta E / Istoric: Punctul de date: E / Istoric: Tip: com.google.step_count.delta E / Istoric: Început: 23 februarie 2016 11:02:31 E / Istorie: Sfârșit: 24 februarie 2016 11:02:31 E / Istorie: Domeniu: pași Valoare: 9765
Acum știți cum să preluați datele Google Fit pe baza unui interval de timp. Un dezvoltator obișnuit al cazurilor de utilizare are nevoie de date pentru ziua curentă. Din fericire, Google a făcut acest lucru ușor adăugând Fitness.HistoryApi.readDailyTotal
apel, care creează o DailyTotalResult
obiecte care conțin date colectate pentru ziua respectivă.
privat void displayStepDataForToday () DailyTotalResult rezultat = Fitness.HistoryApi.readDailyTotal (mGoogleApiClient, DataType.TYPE_STEP_COUNT_DELTA) .auit (1, TimeUnit.MINUTES); showDataSet (result.getTotal ());
Codul de mai sus înregistrează datele etapelor utilizatorului pentru această zi.
E / Istoric: Datele returnate pentru Tipul de date: com.google.step_count.delta E / Istoric: Punctul de date: E / Istoric: Tip: com.google.step_count.delta E / Istoric: Start: Feb 24, 2016 8:39 : 59 AM E / Istorie: Sfârșit: 24 februarie 2016 8:39:59 E / Istorie: Câmp: pași Valoare: 9474
Deși este capabil să citești date din Google Fit, este posibil să existe momente în care trebuie să adaugi propriile date colectate în magazinul de date Google Fit. Pentru a face acest lucru, selectați un interval de timp pentru date și creați un Sursă de date
obiect care reprezintă tipul de informații pe care le puneți în Google Fit. Apoi, creați un DataSet
obiect și locul un nou DataPoint
în ea pentru operația de inserare.
Pentru acest exemplu, vom presupune că utilizatorul a parcurs un milion de pași sau aproximativ 500 de mile și a introdus datele pasului brut în ultima oră a activității utilizatorului.
Este important să rețineți că dacă selectați un interval de timp care se întinde pe mai multe zile, numărul de pași pe care îl inserați este distribuit în mod egal între acele zile.
Calendarul cal = Calendar.getInstance (); Data acum = data nouă (); cal.setTime (acum); lungul endTime = cal.getTimeInMillis (); cal.add (Calendar.HOUR_OF_DAY, -1); long startTime = cal.getTimeInMillis (); DataSource dataSource = nou DataSource.Builder () .setAppPackageName (acest) .setDataType (DataType.TYPE_STEP_COUNT_DELTA) .Numar ("Step Count") .setType (DataSource.TYPE_RAW) .build (); int stepCountDelta = 1000000; DataSet dataSet = DateSet.create (sursă de date); Punctul PointPoint = dataSet.createDataPoint () .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS); point.getValue (Field.FIELD_STEPS) .setInt (stepCountDelta); dataSet.add (punct);
După crearea fișierului DataSet
obiect, îl puteți introduce în magazinul de date Google Fit utilizând API-urile de istorie insertData
apel.
Fitness.HistoryApi.insertData (mGoogleApiClient, dataSet) .auit (1, TimeUnit.MINUTES);
Dacă introduceți pașii utilizatorului și apoi citiți jurnalul de activități, ar trebui să vedeți ceva similar cu următorul:
E / Istoric: Datele returnate pentru Tipul de date: com.google.step_count.delta E / Istorie: Punctul de date: E / Istoric: Tip: com.google.step_count.delta E / Istoric: Start: Feb 27, 2016 10:05 : 18 PM E / Istorie: Sfârșit: 28 februarie 2016 10:05:18 E / Istorie: Câmp: pași Valoare: 1008747
După ce ați introdus datele în Google Fit, nu mai puteți introduce date de tipul respectiv, dacă acestea se suprapun cu datele existente. Acest lucru ar putea cauza o problemă dacă utilizatorul ar fi urmat 500 de mile și apoi a urmat 500 de persoane.
Pentru a rezolva acest lucru, trebuie să utilizați updateData
apel. Din fericire, actualizarea datelor este aproape identică cu introducerea de date noi, cu excepția faptului că creați un DataUpdateRequest
in schimb.
Calendarul cal = Calendar.getInstance (); Data acum = data nouă (); cal.setTime (acum); lungul endTime = cal.getTimeInMillis (); cal.add (Calendar.HOUR_OF_DAY, -1); long startTime = cal.getTimeInMillis (); DataSource dataSource = nou DataSource.Builder () .setAppPackageName (acest) .setDataType (DataType.TYPE_STEP_COUNT_DELTA) .Numar ("Step Count") .setType (DataSource.TYPE_RAW) .build (); int stepCountDelta = 2000000; DataSet dataSet = DateSet.create (sursă de date); Punctul PointPoint = dataSet.createDataPoint () .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS); point.getValue (Field.FIELD_STEPS) .setInt (stepCountDelta); dataSet.add (punct); DataUpdateRequest updateRequest = nou DataUpdateRequest.Builder (). SetDataSet (dataSet) .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS) .build (); Fitness.HistoryApi.updateData (mGoogleApiClient, updateRequest) .auit (1, TimeUnit.MINUTES);
Dacă urmați pașii utilizatorului pentru ziua următoare executării celor de mai sus, ar trebui să vedeți peste 2 milioane de pași.
E / Istoric: Datele returnate pentru Tipul de date: com.google.step_count.delta E / Istorie: Punctul de date: E / Istoric: Tip: com.google.step_count.delta E / Istoric: Start: Feb 27, 2016 10:05 : 18 PM E / Istorie: Sfârșit: Feb 28, 2016 10:05:18 PM E / Istorie: Domeniu: pași Valoare: 2008747
Operațiunea finală disponibilă prin API-ul Google Fit History Fit este capacitatea de a șterge datele pe care le-ați stocat în Google Fit. Acest lucru se poate face prin selectarea unui interval de date, crearea unui DataDeleteRequest
obiect și chemare deleteData
din istoricul API. În timp ce vă puteți șterge propriile date introduse, datele stocate de Google Fit nu sunt eliminate.
Calendarul cal = Calendar.getInstance (); Data acum = data nouă (); cal.setTime (acum); lungul endTime = cal.getTimeInMillis (); cal.add (Calendar.DAY_OF_YEAR, -1); long startTime = cal.getTimeInMillis (); Cererea DataDeleteRequest = noua dataDeleteRequest.Builder () .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS) .addDataType (DataType.TYPE_STEP_COUNT_DELTA) .build (); Fitness.HistoryApi.deleteData (mGoogleApiClient, cerere) .auit (1, TimeUnit.MINUTES);
După cum ați văzut, istoricul API este un instrument incredibil de puternic pentru accesarea și manipularea magazinului de date Google Fit. În timp ce alte API-uri Google Fit sunt destinate să adune date, istoricul API vă permite să păstrați și să accesați datele pentru analiză. Acum ar trebui să puteți crea aplicații uimitoare care să profite de această caracteristică.