L'API Recording su dispositivi mobili consente alla tua app di registrare i passi, in modo simile a un pedometro che recupera i dati sul numero di passi, da un dispositivo mobile in modo parsimonioso con la batteria. Questa API è senza account, il che significa che non richiede un Account Google per utilizzare il servizio e i dati vengono archiviati sul dispositivo.
Questa guida spiega come utilizzare l'API Recording su dispositivi mobili nelle tue esperienze di salute e fitness.
Per un esempio, consulta l'esempio di API Recording su dispositivi mobili su GitHub.
Dettagli importanti
Esistono diverse funzionalità importanti uniche dell'API Recording sui dispositivi mobili:
- Una volta iniziato o rinnovato l'abbonamento alla registrazione, i dati dall'ultimo abbonamento, per un massimo di 10 giorni, sono accessibili.
- I dati sono disponibili solo se è presente un abbonamento attivo. Se un abbonamento viene rimosso chiamando
unsubscribe
, i dati dei passaggi raccolti non saranno accessibili.
Tipi di dati
L'API Recording su dispositivi mobili può registrare i seguenti tipi di dati:
Inizia
Per iniziare, aggiungi la seguente dipendenza al file build.gradle
:
DSL Kotlin
plugin {
id("com.android.application")
}
...
dependencies {
implementation("com.google.android.gms:play-services-fitness:21.2.0")
}
Groovy DSL
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
Eseguire un controllo della versione di Play Services
Per utilizzare l'API Recording su dispositivi mobili, l'utente deve avere aggiornato Google Play Services alla versione LOCAL_RECORDING_CLIENT_MIN_VERSION_CODE
. Puoi verificare questo
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
In caso contrario, se la versione di Google Play Services dell'utente è troppo bassa, il sistema genera un'eccezione ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED
.
Iscriversi ai dati relativi al fitness
Per richiedere la raccolta in background dei dati relativi ai passi, utilizza il metodo
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
Una volta effettuata la sottoscrizione, richiedi i dati utilizzando il metodo readData
. Poi puoi ottenere LocalDataPoints dall'LocalDataSet
risultante creando un LocalDataReadRequest
, come mostrato nello snippet di codice seguente:
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 raccolta dei dati. Puoi
utilizzare readData
per recuperare i numeri più recenti in qualsiasi momento.
Tieni presente che LocalRecordingClient
memorizza fino a 10 giorni di dati. Per ridurre il rischio di perdita di dati, puoi utilizzare WorkManager per raccogliere periodicamente i dati in background.
Annullare l'iscrizione ai dati relativi all'attività fisica
Per liberare risorse, assicurati di annullare l'iscrizione alla raccolta dei dati dei sensori quando la tua app non ne ha più bisogno. Per cancellarti, utilizza 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)
}