Google Fit for Android History API

Google Fit er en plattform som gjør det mulig for utviklere å bygge applikasjoner som er fokusert på brukerens treningsdata. Et av verktøyene Google har oppgitt, er Google Fit for Android, som er tilgjengelig som en pakke i Google Play Services.

I en tidligere opplæring undersøkte vi hvordan du bruker Google Fit Recording API til å lagre treningsdata via Google Play Services. Denne opplæringen ekspanderer på emnet ved å utforske hvordan du får tilgang til og oppdaterer data lagret i Google Fit ved hjelp av History API.

Det som gjør Google Fit kraftig, er at treningsdata lagres gjennom Google Cloud Services, som gjør det mulig å få tilgang til og analysere på et senere tidspunkt. Mens sensorene og innspillings-APIene er fokusert på å samle treningsdata fra en Android-enhet, er History API ment å gi utviklere lett tilgang til de lagrede dataene.

Denne opplæringen går deg gjennom et prøveprosjekt som demonstrerer hvordan du arbeider med History API. Det ferdige produktet kan lastes ned fra GitHub.

1. Prosjektoppsett

Trinn 1: Konfigurer utviklerkonsollen

For å bruke Google Fit må du opprette en OAuth 2.0 klient-ID og registrere programmet ditt gjennom Google Developer Console. Du finner en detaljert forklaring på hvordan du setter opp et prosjekt i Google Developer Console i min veiledning om API for Google Fit Sensors.

Trinn 2: Opprett Android-prosjektet

Når du har konfigurert søknaden din for godkjenning i Google Developer Console, bruker du pakkenavnet du registrerte for å opprette et nytt Android-program med et minimum SDK på 9 og en tom Aktivitet.

Med basen Android app opprettet, åpne build.gradle og inkludere Google Play-tjenester under avhengighetsnoden og synkroniser appen din.

kompilere 'com.google.android.gms: play-services-fitness: 8.4.0'

Du bør nå kunne inkludere de nødvendige Google Play-tjenesteklassene i søknaden din. Før vi dykker inn i Java-koden for denne opplæringen, åpner du activity_main.xml og endre den slik at den inneholder fem Knapp elementer som vi skal bruke for å demonstrere noen av funksjonaliteten til History API.

  

Når du kjører programmet, bør brukergrensesnittet se slik ut:

For å fortsette å sette opp prosjektet, åpne MainActivity.java og implementer følgende tilbakeringinger og nødvendige metoder:

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

Du må også legge til en medlemsvariabel for GoogleApiClient og et sett med referanser til din Knapp objekter, som vist nedenfor.

offentlig klasse MainActivity utvider AppCompatActivity implementerer GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, View.OnClickListener privat knapp mButtonViewWeek; privat knapp mButtonViewToday; privat knapp mButtonAddSteps; privat knapp mButtonUpdateSteps; privat knapp mButtonDeleteSteps; privat 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");  offentlig ugyldig påkoblet (@Nullable Bundle-pakke) Log.e ("HistoryAPI", "onConnected");  @Override public void onClick (Vis v) 

Den endelige tingen du må gjøre for å sette opp prøveprosjektet ditt, er koblet til Google Play Services. Dette kan gjøres på slutten av onCreate () metode.

mGoogleApiClient = ny GoogleApiClient.Builder (dette) .addApi (Fitness.HISTORY_API) .addScope (nytt område (Scopes.FITNESS_ACTIVITY_READ_WRITE)) .addConnectionCallbacks (dette) .enableAutoManage (dette, 0, dette) .build ();

Med koden ovenfor kobler vi til Google Play Services og ber om tilgang til History API i Google Fit, samt tillatelse til å lese og skrive aktivitetsdata. Ved å legge til enableAutoManage eiendom, administrerer Google Play Services tilkobling og frakobling på riktig måte.

2. Bruk API-passordet for Google Fit History

Ved hjelp av History API kan du hente og samle data, sette inn verdier som du har samlet i appen din, eller slette data som kan lagres. En viktig ting å merke seg er at alle History API-operasjonene i denne opplæringen må gjøres utenfor hovedtråden. Med andre ord skjer hver operasjon i en AsyncTask:

Private klasse ViewWeekStepCountTask utvider AsyncTask protected Void doInBackground (void ... params) displayLastWeeksData (); return null; 

Trinn 1: Viser data over tid

En oppgave som du kanskje vil gjøre er å bruke eller vise data som er samlet inn over tid. Du kan gjøre dette ved å opprette en ny DataReadRequest for en bestemt type data som passer til noen søkeparametere.

Du kan gruppere disse dataene sammen i Bøtte objekter etter tid eller økter. For dette eksempelet ber du aggregater for trinndata for den siste uken og bøtte den data om dagen.

Kalender cal = Calendar.getInstance (); Dato nå = nytt Dato (); cal.setTime (nå); lang endTime = cal.getTimeInMillis (); cal.add (Kalender.WEEK_OF_YEAR, -1); lang 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)); // Sjekk hvor mange trinn som gikk og registrert de siste 7 dagene DataReadRequest readRequest = ny DataReadRequest.Builder () .aggregate (DataType.TYPE_STEP_COUNT_DELTA, DataType.AGGREGATE_STEP_COUNT_DELTA) .bucketByTime (1, TimeUnit.DAYS) .setTimeRange (startTime, endTime , TimeUnit.MILLISECONDS) .build ();

Når du har din DataReadRequest opprettet, kan du be om data fra GoogleApiClient bruker Fitness.HistoryApi.readData kommando. Du ringer også avvente på API-klienten slik at tråden står i opptil et minutt mens du venter på spørringen. Hvis noe går galt, fortsetter tråden etter det minuttet.

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

Hvis samtalen går vellykket, kan du få tilgang til brukerens treningsdata fra DataReadResult gjenstand. Din forespørsel om trinndata returneres i Bøtte objekter, selv om andre typer data returneres som en Liste av datasett objekter. Avhengig av hvilken type data som er returnert, kan du få tilgang til den med følgende kode:

// Brukes for aggregerte data hvis (dataReadResult.getBuckets () .størrelse ()> 0) Log.e ("History", "Antall bøtter:" + dataReadResult.getBuckets (). Size ()); for (Bucket bucket: dataReadResult.getBuckets ()) Liste dataSets = bucket.getDataSets (); for (DataSet dataSet: dataSets) showDataSet (dataSet);  // Brukes for ikke-aggregerte data ellers hvis (dataReadResult.getDataSets (). Size ()> 0) Log.e ("History", "Antall returnerte DataSets:" + dataReadResult.getDataSets ()); for (DataSet dataSet: dataReadResult.getDataSets ()) showDataSet (dataSet); 

Du kan da hente hver Datapunkt fra datasett gjenstander som er returnert.

Private void showDataSet (DataSet dataSet) Log.e ("History", "Data returnert for Datatype:" + dataSet.getDataType (). getName ()); DateFormat dateFormat = DateFormat.getDateInstance (); DateFormat timeFormat = DateFormat.getTimeInstance (); for (DataPoint dp: dataSet.getDataPoints ()) Log.e ("History", "Data point:"); 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 (Feltfelt: dp.getDataType (). getFields ()) Log.e ("History", "\ tField:" + field.getName () + "Value:" + dp.getValue (field)); 

Hvis en app på brukerens enhet har slått på opptaksprogrammet i løpet av forrige uke, mottar du data for hver dag den var aktiv. Loggene fra koden ovenfor skal se ut som dette:

E / Historikk: Utvalgets startdato: 17 februar 2016 E / Historikk: Utløpsdato: 24 februar 2016 E / Historikk: Antall bøtter: 7 E / Historikk: Data returnert for Datatype: com.google.step_count.delta E / Historikk: Datapunkt: E / Historikk: Type: com.google.step_count.delta E / History: Start: 17. februar, 2016 11:01:46 E / Historikk: Slutt: 17 feb, 2016 11:01:46 E / Historikk: Felt: trinn Verdi: 9360 E / Historikk: Data returnert for Datatype: com.google.step_count.delta E / History: Data returnert for Datatype: com.google.step_count.delta E / History: Data returnert for datatype: com.google.step_count.delta E / History: Datapunkt: E / History: Type: com.google.step_count.delta E / History: Start: 21 februar 2016 09:58:03 E / History : Slutt: 21 februar 2016 9:58:03 E / Historikk: Felt: trinn Verdi: 10041 E / Historikk: Data returnert for Datatype: com.google.step_count.delta E / History: Datapunkt: E / Historikk : Type: com.google.step_count.delta E / History: Start: 21 februar 2016 11:22:53 E / Historikk: Slutt: 22 februar 2016 11:22:53 E / Historikk: Felt: trinn Verdi : 10786 E / Historikk: Data returnert for Datatype: com.google.step_count.delta E / History: Datapunkt: E / Historikk: Type: com.google.step_count.delta E / History: Start: 22. februar 2016 11 : 06: 31 E / Historikk: Slutt: 23 februar 2016 11:06:31 E / Historikk: Felt: trinn Verdi: 13099 E / Historikk: Data returnert for Datatype: com.google.step_count.delta E / Historikk: Datapunkt: E / Historikk: Type: com.google.step_count.delta E / History: Start: 23. februar 2016 11:02:31 E / Historikk: Slutt: 24 februar 2016 11:02:31 E / Historikk: Felt: trinn Verdi: 9765

Trinn 2: Viser data for i dag

Du vet nå hvordan du henter Google Fit-data basert på en tidsramme. En vanlig brukstilstand utviklere har, trenger data for dagens dag. Heldigvis har Google gjort det enkelt ved å legge til Fitness.HistoryApi.readDailyTotal ring, som lager en DailyTotalResult objekt som inneholder data samlet for dagen.

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

Koden ovenfor logger ut brukerens trinndata for dagen.

E / Historikk: Data returnert for Datatype: com.google.step_count.delta E / History: Datapunkt: E / History: Type: com.google.step_count.delta E / History: Start: 24. februar 2016 8:39 : 59 E / Historikk: Slutt: 24 februar 2016 8:39:59 E / Historikk: Felt: trinn Verdi: 9474

Trinn 3: Sette inn data i Google Fit

Selv om det er viktig å kunne lese data fra Google Fit, kan det være tider hvor du må legge til dine egne samlede data i Google Fit datalager. For å gjøre dette, velger du et tidsintervall for dataene og lager en Datakilde objekt som representerer typen informasjon du legger inn i Google Fit. Deretter oppretter du en datasett objekt og legg inn en ny Datapunkt inn i den for innsatsoperasjonen.

For dette eksempelet skal vi anta at brukeren har gått en million trinn, eller omtrent 500 miles, og sett inn de rå trinndataene inn i den siste timen av brukerens aktivitet.

Det er viktig å merke seg at hvis du velger et tidsområde som strekker seg over flere dager, er antall trinn du legger inn jevnt fordelt mellom de dagene.

Kalender cal = Calendar.getInstance (); Dato nå = nytt Dato (); cal.setTime (nå); lang endTime = cal.getTimeInMillis (); cal.add (Kalender.HOUR_OF_DAY, -1); lang startTime = cal.getTimeInMillis (); DataSource dataSource = nytt DataSource.Builder () .setAppPackageName (dette) .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);

Etter å ha opprettet datasett objekt, kan du sette det inn i Google Fit datalagret ved hjelp av History API insertData anrop.

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

Hvis du legger inn brukerens trinn og leser aktivitetsloggen, bør du se noe som ligner på følgende:

E / Historikk: Data returnert for Datatype: com.google.step_count.delta E / History: Datapunkt: E / History: Type: com.google.step_count.delta E / History: Start: 27. februar 2016 10:05 : 18:00 E / Historikk: Slutt: 28 feb, 2016 10:05:18 E / Historikk: Felt: trinn Verdi: 1008747

Trinn 4: Oppdater data på Google Fit

Når du har lagt inn data i Google Fit, kan du ikke sette inn flere data av den typen hvis den overlapper eksisterende data. Dette kan forårsake et problem hvis brukeren hadde gått 500 miles og deretter gikk 500 mer.

For å løse dette må du bruke updateData anrop. Heldigvis er oppdatering av data nesten identisk med å sette inn nye data, bortsett fra at du lager en DataUpdateRequest i stedet.

Kalender cal = Calendar.getInstance (); Dato nå = nytt Dato (); cal.setTime (nå); lang endTime = cal.getTimeInMillis (); cal.add (Kalender.HOUR_OF_DAY, -1); lang startTime = cal.getTimeInMillis (); DataSource dataSource = nytt DataSource.Builder () .setAppPackageName (dette) .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);

Hvis du skulle logge ut brukerens trinn for dagen etter at du kjørte ovenstående, bør du se over to millioner trinn.

E / Historikk: Data returnert for Datatype: com.google.step_count.delta E / History: Datapunkt: E / History: Type: com.google.step_count.delta E / History: Start: 27. februar 2016 10:05 : 18:00 E / Historikk: Slutt: 28 februar 2016 10:05:18 E / Historikk: Felt: trinn Verdi: 2008747

Trinn 5: Slette data fra Google Fit

Den endelige operasjonen som er tilgjengelig via Google Fit History API, er muligheten til å slette data som du har lagret i Google Fit. Dette kan gjøres ved å velge et datoperiode, opprette en DataDeleteRequest objekt og ringer deleteData fra History API. Mens du kan slette dine egne innførte data, blir dataene som er lagret av Google Fit, ikke fjernet.

Kalender cal = Calendar.getInstance (); Dato nå = nytt Dato (); cal.setTime (nå); lang endTime = cal.getTimeInMillis (); cal.add (Kalender.DAY_OF_YEAR, -1); lang startTime = cal.getTimeInMillis (); DataDeleteRequest request = ny DataDeleteRequest.Builder () .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS) .addDataType (DataType.TYPE_STEP_COUNT_DELTA) .build (); Fitness.HistoryApi.deleteData (mGoogleApiClient, request) .await (1, TimeUnit.MINUTES);

Konklusjon

Som du har sett, er History API et utrolig kraftig verktøy for å få tilgang til og manipulere Google Fit datalager. Mens andre APIs for Google Fit er ment å samle data, lar historikk-API deg å vedlikeholde og få tilgang til data for analyse. Du bør nå kunne lage fantastiske apps som utnytter denne funksjonen.