L'API Recording su dispositivo mobile consente alla tua app di registrare i passi da un dispositivo mobile a basso consumo. Questa API è senza account, ovvero non richiede un Account Google per usare il servizio e i dati vengono memorizzati sul dispositivo.
Questa guida ti mostra come usare l'API Recording su dispositivi mobili in ambito sanitario e esperienze di fitness.
Dettagli importanti
L'API Recording sui dispositivi mobili offre diverse funzionalità degne di nota, specifiche per:
- Una volta che l'abbonamento alla registrazione inizia o viene rinnovato, i dati a partire dall'ultima abbonamento, per un massimo di 10 giorni, sia accessibile.
- I dati sono disponibili solo quando è presente un abbonamento attivo. Se un abbonamento
viene rimosso chiamando
unsubscribe
, i dati dei passi raccolti non saranno accessibili.
Tipi di dati
L'API Recording su dispositivo mobile può registrare i seguenti tipi di dati:
Inizia
Per iniziare, aggiungi la seguente dipendenza nel file build.gradle
:
DSL Kotlin
plugin {
id("com.android.application")
}
...
dependencies {
implementation("com.google.android.gms:play-services-fitness:21.2.0")
}
DSL alla moda
apply plugin: 'com.android.application'
...
dependencies {
implementation 'com.google.android.gms:play-services-fitness:21.2.0'
}
Richiedi autorizzazioni
Per registrare i dati utilizzando l'API Recording su dispositivi mobili, la tua app dovrà richiedere la seguente autorizzazione:
android.permission.ACTIVITY_RECOGNITION
Esegui un controllo della versione di Play Services
Per utilizzare l'API Recording sui dispositivi mobili, l'utente deve avere Google Play Services
aggiornato a LOCAL_RECORDING_CLIENT_MIN_VERSION_CODE
. Puoi verificare
utilizzando il metodo isGooglePlayServicesAvailable
:
val hasMinPlayServices = isGooglePlayServicesAvailable(context, LocalRecordingClient.LOCAL_RECORDING_CLIENT_MIN_VERSION_CODE)
if(hasMinPlayServices != ConnectionResult.SUCCESS) {
// Prompt user to update their device's Google Play services app and return
}
// Continue with Recording API functions
Altrimenti, se la versione di Google Play Services in uso è troppo vecchia, il sistema
genera un ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED
.
Iscriviti a Dati di fitness
Per richiedere la raccolta in background di dati sui passi, utilizza la
subscribe
, come mostrato nel seguente snippet di codice:
val localRecordingClient = FitnessLocal.getLocalRecordingClient(this)
// Subscribe to steps data
localRecordingClient.subscribe(LocalDataType.TYPE_STEP_COUNT_DELTA)
.addOnSuccessListener {
Log.i(TAG, "Successfully subscribed!")
}
.addOnFailureListener { e ->
Log.w(TAG, "There was a problem subscribing.", e)
}
Leggere ed elaborare i dati relativi all'attività fisica
Dopo aver effettuato l'iscrizione, richiedi i dati utilizzando il metodo readData
. Poi potrai
ottenere LocalDataPoints dal risultato LocalDataSet
tramite
creando un LocalDataReadRequest
, come mostrato nel seguente codice
snippet:
val endTime = LocalDateTime.now().atZone(ZoneId.systemDefault())
val startTime = endTime.minusWeeks(1)
val readRequest =
LocalDataReadRequest.Builder()
// The data request can specify multiple data types to return,
// effectively combining multiple data queries into one call.
// This example demonstrates aggregating only one data type.
.aggregate(LocalDataType.TYPE_STEP_COUNT_DELTA)
// Analogous to a "Group By" in SQL, defines how data should be
// aggregated. bucketByTime allows bucketing by time span.
.bucketByTime(1, TimeUnit.DAYS)
.setTimeRange(startTime.toEpochSecond(), endTime.toEpochSecond(), TimeUnit.SECONDS)
.build()
localRecordingClient.readData(readRequest).addOnSuccessListener { response ->
// The aggregate query puts datasets into buckets, so flatten into a
// single list of datasets.
for (dataSet in response.buckets.flatMap { it.dataSets }) {
dumpDataSet(dataSet)
}
}
.addOnFailureListener { e ->
Log.w(TAG,"There was an error reading data", e)
}
fun dumpDataSet(dataSet: LocalDataSet) {
Log.i(TAG, "Data returned for Data type: ${dataSet.dataType.name}")
for (dp in dataSet.dataPoints) {
Log.i(TAG,"Data point:")
Log.i(TAG,"\tType: ${dp.dataType.name}")
Log.i(TAG,"\tStart: ${dp.getStartTime(TimeUnit.HOURS)}")
Log.i(TAG,"\tEnd: ${dp.getEndTime(TimeUnit.HOURS)}")
for (field in dp.dataType.fields) {
Log.i(TAG,"\tLocalField: ${field.name.toString()} LocalValue: ${dp.getValue(field)}")
}
}
}
LocalRecordingClient
aggiorna continuamente la propria raccolta di dati. Puoi
usa readData
per estrarre i numeri più recenti in qualsiasi momento.
Tieni presente che LocalRecordingClient
memorizza fino a 10 giorni di dati. Per ridurre il
di perdere dati, puoi usare WorkManager per raccogliere periodicamente i dati
sullo sfondo.
Annulla l'iscrizione ai dati relativi all'attività fisica
Per liberare risorse, devi assicurarti di annullare l'iscrizione al
raccolta dei dati dei sensori quando l'app non ne ha più bisogno. A
annulla l'iscrizione, usa il metodo unsubscribe
:
val localRecordingClient = FitnessLocal.getLocalRecordingClient(this)
// Unsubscribe from steps data
localRecordingClient.unsubscribe(LocalDataType.TYPE_STEP_COUNT_DELTA)
.addOnSuccessListener {
Log.i(TAG, "Successfully unsubscribed!")
}
.addOnFailureListener { e ->
Log.w(TAG, "There was a problem unsubscribing.", e)
}