Google Fit è una piattaforma che consente agli sviluppatori di creare applicazioni incentrate sui dati di idoneità dell'utente. Uno degli strumenti che Google ha fornito è Google Fit per Android, disponibile come pacchetto in Google Play Services.
In un precedente tutorial, abbiamo esplorato come utilizzare l'API di registrazione di Google Fit per archiviare i dati di fitness tramite Google Play Services. Questo tutorial espande l'argomento esplorando come accedere e aggiornare i dati memorizzati in Google Fit utilizzando l'API Cronologia.
Ciò che rende Google Fit potente è che i dati di fitness vengono archiviati tramite Google Cloud Services, che consente di accedervi e analizzarli in un secondo momento. Mentre le API Sensors e Recording sono focalizzate sulla raccolta di dati di fitness da un dispositivo Android, l'API History ha lo scopo di fornire agli sviluppatori un facile accesso ai dati memorizzati.
Questo tutorial ti guida attraverso un progetto di esempio che dimostra come utilizzare l'API Cronologia. Il prodotto finito può essere scaricato da GitHub.
Per utilizzare Google Fit, devi creare un ID cliente OAuth 2.0 e registrare la tua applicazione tramite la Google Developer Console. Puoi trovare una spiegazione dettagliata su come impostare un progetto nella Google Developer Console nel mio tutorial sull'API di Google Fit Sensors.
Dopo aver configurato la tua applicazione per l'autenticazione nella Google Developer Console, utilizza il nome del pacchetto registrato per creare una nuova applicazione Android con un SDK minimo di 9 e uno vuoto Attività
.
Con l'app Android di base creata, aperta build.gradle e includi Google Play Services sotto il nodo delle dipendenze e sincronizza la tua app.
compila "com.google.android.gms: play-services-fitness: 8.4.0"
Ora dovresti essere in grado di includere le classi necessarie di Google Play Services nella tua applicazione. Prima di immergerci nel codice Java per questo tutorial, apri activity_main.xml e modificarlo in modo che includa cinque Pulsante
elementi che utilizzeremo per dimostrare alcune funzionalità dell'API di cronologia.
Quando si esegue l'applicazione, l'interfaccia utente dovrebbe assomigliare a questa:
Per continuare a configurare il tuo progetto, apri MainActivity.java e implementare i seguenti callback e metodi richiesti:
GoogleApiClient.ConnectionCallbacks
GoogleAPiClient.OnConnectionFailedListener
View.OnClickListener
È inoltre necessario aggiungere una variabile membro per il GoogleApiClient
e una serie di riferimenti al tuo Pulsante
oggetti, come mostrato di seguito.
public class MainActivity estende AppCompatActivity implementa GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, View.OnClickListener private Button mButtonViewWeek; Pulsante privato mButtonViewToday; Pulsante privato mButtonAddSteps; Pulsante privato mButtonUpdateSteps; Pulsante privato mButtonDeleteSteps; GoogleApiClient privato 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 (questo); mButtonViewToday.setOnClickListener (questo); mButtonAddSteps.setOnClickListener (questo); mButtonUpdateSteps.setOnClickListener (questo); mButtonDeleteSteps.setOnClickListener (questo); @Override public void onConnectionSuspended (int i) Log.e ("HistoryAPI", "onConnectionSuspended"); @Override public void onConnectionFailed (@NonNull ConnectionResult connectionResult) Log.e ("HistoryAPI", "onConnectionFailed"); public void onConnected (bundle @Nullable Bundle) Log.e ("HistoryAPI", "onConnected"); @Override public void onClick (Visualizza v)
L'ultima cosa che devi fare per impostare il tuo progetto di esempio è connettersi a Google Play Services. Questo può essere fatto alla fine del onCreate ()
metodo.
mGoogleApiClient = new GoogleApiClient.Builder (this) .addApi (Fitness.HISTORY_API) .addScope (new Scope (Scopes.FITNESS_ACTIVITY_READ_WRITE)) .addConnectionCallbacks (this) .enableAutoManage (this, 0, this) .build ();
Con il codice sopra, ci colleghiamo ai servizi di Google Play e richiediamo l'accesso all'API della cronologia in Google Fit, nonché l'autorizzazione a leggere e scrivere dati sulle attività. Aggiungendo il enableAutoManage
proprietà, i servizi di Google Play gestiscono la connessione e la disconnessione correttamente.
Utilizzando l'API Cronologia, puoi recuperare e aggregare i dati, inserire i valori che hai raccolto nella tua app o eliminare i dati che potrebbero essere memorizzati. Una cosa importante da notare è che tutte le operazioni API della cronologia in questo tutorial devono essere eseguite al di fuori del thread principale. In altre parole, ogni operazione si svolge in un AsyncTask
:
classe privata ViewWeekStepCountTask estende AsyncTaskprotected Void doInBackground (Void ... params) displayLastWeeksData (); return null;
Un compito che potresti voler fare è utilizzare o visualizzare i dati che sono stati raccolti nel tempo. Puoi farlo creando un nuovo DataReadRequest
per un tipo specifico di dati che si adatta a alcuni parametri di query.
È possibile raggruppare questi dati insieme in Secchio
oggetti per tempo o sessioni. Per questo esempio, si richiedono dati di aggregati aggregati per l'ultima settimana e il bucket di tali dati per giorno.
Calendar cal = Calendar.getInstance (); Data ora = nuova Data (); cal.setTime (ora); long endTime = cal.getTimeInMillis (); cal.add (Calendar.WEEK_OF_YEAR, -1); long startTime = cal.getTimeInMillis (); java.text.DateFormat dateFormat = DateFormat.getDateInstance (); Log.e ("Cronologia", "Inizio intervallo:" + dateFormat.format (startTime)); Log.e ("Cronologia", "Fine intervallo:" + dateFormat.format (endTime)); // Controlla quanti passi sono stati calpestati e registrati negli ultimi 7 giorni 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 ();
Una volta che hai il tuo DataReadRequest
creato, è possibile richiedere i dati dal GoogleApiClient
usando il Fitness.HistoryApi.readData
comando. Chiami anche tu attendere
sul client API in modo che il thread si blocchi per un minuto durante l'attesa della query. Se qualcosa va storto, il thread continua dopo quel minuto.
DataReadResult dataReadResult = Fitness.HistoryApi.readData (mGoogleApiClient, readRequest) .await (1, TimeUnit.MINUTES);
Se la chiamata ritorna correttamente, è possibile accedere ai dati di idoneità dell'utente da DataReadResult
oggetto. La tua richiesta di dati passo viene restituita Secchio
oggetti, anche se altri tipi di dati vengono restituiti come Elenco
di DataSet
oggetti. A seconda del tipo di dati restituiti, è possibile accedervi con il seguente codice:
// Utilizzato per dati aggregati if (dataReadResult.getBuckets (). Size ()> 0) Log.e ("Cronologia", "Numero di bucket:" + dataReadResult.getBuckets (). Size ()); per (Benna secchio: dataReadResult.getBuckets ()) ListadataSets = bucket.getDataSets (); for (DataSet dataSet: dataSets) showDataSet (dataSet); // Utilizzato per dati non aggregati else if (dataReadResult.getDataSets (). Size ()> 0) Log.e ("Cronologia", "Numero di set di dati restituiti:" + dataReadResult.getDataSets (). Size ()); for (DataSet dataSet: dataReadResult.getDataSets ()) showDataSet (dataSet);
È quindi possibile recuperare ciascuno DataPoint
dal DataSet
oggetti che sono stati restituiti.
private void showDataSet (DataSet dataSet) Log.e ("Cronologia", "Dati restituiti per Tipo di dati:" + dataSet.getDataType (). getName ()); DateFormat dateFormat = DateFormat.getDateInstance (); DateFormat timeFormat = DateFormat.getTimeInstance (); for (DataPoint dp: dataSet.getDataPoints ()) Log.e ("Cronologia", "Punto dati:"); Log.e ("Cronologia", "\ tType:" + dp.getDataType (). GetName ()); Log.e ("Cronologia", "\ tStart:" + dateFormat.format (dp.getStartTime (TimeUnit.MILLISECONDS)) + "" + timeFormat.format (dp.getStartTime (TimeUnit.MILLISECONDS))); Log.e ("Cronologia", "\ tEnd:" + dateFormat.format (dp.getEndTime (TimeUnit.MILLISECONDS)) + "" + timeFormat.format (dp.getStartTime (TimeUnit.MILLISECONDS))); for (Campo: dp.getDataType (). getFields ()) Log.e ("Cronologia", "\ tField:" + field.getName () + "Valore:" + dp.getValue (campo));
Se un'app sul dispositivo dell'utente ha attivato l'API di registrazione nell'ultima settimana, ricevi i dati per ogni giorno in cui era attiva. I log del codice precedente dovrebbero essere simili a questo:
E / Cronologia: intervallo Inizio: 17 febbraio 2016 E / Cronologia: intervallo Fine: 24 febbraio 2016 E / Cronologia: numero di bucket: 7 E / Cronologia: dati restituiti per Tipo di dati: com.google.step_count.delta E / Cronologia: Punto dati: E / Cronologia: Tipo: com.google.step_count.delta E / Cronologia: Inizio: 17 febbraio 2016 11:01:46 PM E / Cronologia: fine 17 febbraio 2016 11:01:46 PM E / Cronologia: Campo: passi Valore: 9360 E / Cronologia: dati restituiti per Tipo di dati: com.google.step_count.delta E / Cronologia: dati restituiti per Tipo di dati: com.google.step_count.delta E / Cronologia: dati restituiti per Tipo di dati: com.google.step_count.delta E / Cronologia: Punto dati: E / Cronologia: Tipo: com.google.step_count.delta E / Cronologia: Inizio: Feb 21, 2016 9:58:03 AM E / Cronologia : Fine: 21 febbraio 2016 9:58:03 AM E / Cronologia: Campo: passi Valore: 10041 E / Cronologia: dati restituiti per Tipo di dati: com.google.step_count.delta E / Cronologia: Punto dati: E / Cronologia : Digitare: com.google.step_count.delta E / Cronologia: Inizio: Feb 21, 2016 11:22:53 PM E / Cronologia: Fine: 22 febbraio 2016 11:22:53 PM E / Cronologia: Campo: passi Valore : 10786 E / Cronologia: dati restituiti per Tipo di dati: com.google.step_count.delta E / Cronologia: Punto dati: E / Cronologia: Tipo: com.google.step_count.delta E / Cronologia: Inizio: Feb 22, 2016 11 : 06: 31 PM E / Cronologia: fine: 23 febbraio 2016 11:06:31 PM E / Cronologia: Campo: passi Valore: 13099 E / Cronologia: dati restituiti per Tipo di dati: com.google.step_count.delta E / Cronologia: Punto dati: E / Cronologia: Tipo: com.google.step_count.delta E / Cronologia: Inizio: Feb 23, 2016 11:02:31 PM E / Cronologia: Fine: 24 febbraio 2016 11:02:31 PM E / Cronologia: Campo: passi Valore: 9765
Ora sai come recuperare i dati di Google Fit in base a un intervallo di tempo. Uno sviluppatore di casi d'uso comune ha bisogno di dati per il giorno corrente. Fortunatamente, Google lo ha reso semplice aggiungendo il Fitness.HistoryApi.readDailyTotal
chiamata, che crea a DailyTotalResult
oggetto contenente i dati raccolti per il giorno.
private void displayStepDataForToday () DailyTotalResult result = Fitness.HistoryApi.readDailyTotal (mGoogleApiClient, DataType.TYPE_STEP_COUNT_DELTA) .await (1, TimeUnit.MINUTES); showDataSet (result.getTotal ());
Il codice precedente registra i dati relativi agli step dell'utente per il giorno.
E / Cronologia: dati restituiti per Tipo di dati: com.google.step_count.delta E / Cronologia: Punto dati: E / Cronologia: Tipo: com.google.step_count.delta E / Cronologia: Inizio: 24 febbraio 2016 8:39 : 59 AM E / Cronologia: Fine: 24 febbraio 2016 8:39:59 E / Storia: Campo: gradini Valore: 9474
Sebbene sia possibile leggere i dati di Google Fit è importante, a volte è necessario aggiungere i propri dati raccolti all'archivio dati di Google Fit. Per fare ciò, si seleziona un intervallo di tempo per i dati e si crea un Fonte di dati
oggetto che rappresenta il tipo di informazioni che hai inserito in Google Fit. Successivamente, crei un DataSet
oggetto e posto un nuovo DataPoint
in esso per l'operazione di inserimento.
Per questo esempio, supponiamo che l'utente abbia camminato per un milione di passi, o circa 500 miglia, e inserisca i dati dei passaggi grezzi nell'ultima ora dell'attività dell'utente.
È importante notare che se si seleziona un intervallo di tempo compreso tra più giorni, il numero di passaggi inseriti viene equamente distribuito tra quei giorni.
Calendar cal = Calendar.getInstance (); Data ora = nuova Data (); cal.setTime (ora); long endTime = cal.getTimeInMillis (); cal.add (Calendar.HOUR_OF_DAY, -1); long startTime = cal.getTimeInMillis (); DataSource dataSource = new DataSource.Builder () .setAppPackageName (this) .setDataType (DataType.TYPE_STEP_COUNT_DELTA) .setName ("Step Count") .setType (DataSource.TYPE_RAW) .build (); int stepCountDelta = 1000000; DataSet dataSet = DataSet.create (dataSource); DataPoint point = dataSet.createDataPoint () .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS); point.getValue (Field.FIELD_STEPS) .setInt (stepCountDelta); dataSet.add (punto);
Dopo aver creato il DataSet
oggetto, puoi inserirlo nell'archivio dati di Google Fit utilizzando le API della cronologia insertData
chiamata.
Fitness.HistoryApi.insertData (mGoogleApiClient, dataSet) .await (1, TimeUnit.MINUTES);
Se si inseriscono i passaggi dell'utente e quindi si legge il registro delle attività, si dovrebbe vedere qualcosa di simile al seguente:
E / Cronologia: dati restituiti per Tipo di dati: com.google.step_count.delta E / Cronologia: Punto dati: E / Cronologia: Tipo: com.google.step_count.delta E / Cronologia: Inizio: 27 febbraio 2016 10:05 : 18:00 E / Storia: Fine: 28 febbraio 2016 10:05:18 PM E / Cronologia: Campo: passi Valore: 1008747
Una volta inseriti i dati in Google Fit, non puoi inserire altri dati di quel tipo se si sovrappongono ai dati esistenti. Questo potrebbe causare un problema se l'utente avesse camminato per 500 miglia e poi camminato altre 500 volte.
Per risolvere questo, è necessario utilizzare il UpdateData
chiamata. Fortunatamente, l'aggiornamento dei dati è quasi identico all'inserimento di nuovi dati, tranne per il fatto che ne crei uno DataUpdateRequest
anziché.
Calendar cal = Calendar.getInstance (); Data ora = nuova Data (); cal.setTime (ora); long endTime = cal.getTimeInMillis (); cal.add (Calendar.HOUR_OF_DAY, -1); long startTime = cal.getTimeInMillis (); DataSource dataSource = new DataSource.Builder () .setAppPackageName (this) .setDataType (DataType.TYPE_STEP_COUNT_DELTA) .setName ("Step Count") .setType (DataSource.TYPE_RAW) .build (); int stepCountDelta = 2000000; DataSet dataSet = DataSet.create (dataSource); DataPoint point = dataSet.createDataPoint () .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS); point.getValue (Field.FIELD_STEPS) .setInt (stepCountDelta); dataSet.add (punto); DataUpdateRequest updateRequest = new DataUpdateRequest.Builder (). SetDataSet (dataSet) .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS) .build (); Fitness.HistoryApi.updateData (mGoogleApiClient, updateRequest) .await (1, TimeUnit.MINUTES);
Se dovessi disconnettere i passaggi dell'utente per il giorno dopo aver eseguito quanto sopra, dovresti vedere oltre due milioni di passaggi.
E / Cronologia: dati restituiti per Tipo di dati: com.google.step_count.delta E / Cronologia: Punto dati: E / Cronologia: Tipo: com.google.step_count.delta E / Cronologia: Inizio: 27 febbraio 2016 10:05 : 18:00 E / Storia: Fine: 28 febbraio 2016 10:05:18 PM E / Cronologia: Campo: passi Valore: 2008747
L'ultima operazione disponibile tramite l'API di Google Fit History è la possibilità di eliminare i dati memorizzati in Google Fit. Questo può essere fatto selezionando un intervallo di date, creando a DataDeleteRequest
oggetto e chiamata deleteData
dall'API Storia. Mentre puoi eliminare i tuoi dati inseriti, i dati memorizzati da Google Fit non vengono rimossi.
Calendar cal = Calendar.getInstance (); Data ora = nuova Data (); cal.setTime (ora); long endTime = cal.getTimeInMillis (); cal.add (Calendar.DAY_OF_YEAR, -1); long startTime = cal.getTimeInMillis (); DataDeleteRequest request = new DataDeleteRequest.Builder () .setTimeInterval (startTime, endTime, TimeUnit.MILLISECONDS) .addDataType (DataType.TYPE_STEP_COUNT_DELTA) .build (); Fitness.HistoryApi.deleteData (mGoogleApiClient, request) .await (1, TimeUnit.MINUTES);
Come hai visto, la History API è uno strumento incredibilmente potente per accedere e manipolare l'archivio dati di Google Fit. Mentre altre API di Google Fit sono destinate alla raccolta di dati, l'API Cronologia consente di conservare e accedere ai dati per l'analisi. Ora dovresti essere in grado di creare app fantastiche che sfruttano questa funzionalità.