L'API Recording su dispositivi mobili consente alla tua app di registrare i dati di fitness da un dispositivo mobile in modo efficiente dal punto di vista del consumo della batteria. Ad esempio, utilizza questa API per registrare i passi, in modo simile a un pedometro che recupera i dati del conteggio dei passi. Questa API non richiede un account, il che significa che non è necessario un Account Google per utilizzare il servizio e i dati vengono archiviati sul dispositivo.
Questa guida spiega come utilizzare l'API Recording sui dispositivi mobili nelle tue esperienze di salute e fitness.
Per un esempio, consulta la pagina relativa all'API Recording su GitHub.
Dettagli importanti
Esistono diverse funzionalità degne di nota esclusive dell'API Recording su dispositivi mobili:
- Una volta avviato o rinnovato l'abbonamento alla registrazione, i dati dall'ultimo abbonamento, per un massimo di 10 giorni, sono accessibili.
- I dati sono disponibili solo quando è presente un abbonamento attivo. Se un abbonamento
viene rimosso chiamando il numero
unsubscribe
, i dati 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
:
Kotlin DSL
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
Esegui un controllo della versione di Play Services
Per utilizzare l'API Recording su dispositivi mobili, l'utente deve aver aggiornato Google Play Services
alla versione LOCAL_RECORDING_CLIENT_MIN_VERSION_CODE
. Puoi verificarlo
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
.
Subscribe to Fitness Data
Per richiedere la raccolta in background dei dati sui 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)
}
Read and Process Fitness Data
Una volta eseguita la sottoscrizione, richiedi i dati utilizzando il metodo readData
. Poi, puoi
ottenere LocalDataPoints dal LocalDataSet
risultante
effettuando una 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 sua raccolta di dati. Puoi
utilizzare readData
per visualizzare i numeri più recenti in qualsiasi momento.
Tieni presente che LocalRecordingClient
memorizza fino a 10 giorni di dati. Per ridurre il rischio di perdere dati, puoi utilizzare WorkManager per raccoglierli periodicamente in background.
Annullare l'iscrizione ai dati sul fitness
Per liberare risorse, assicurati di annullare l'iscrizione alla raccolta dei dati dei sensori quando la tua app non ne ha più bisogno. Per
annullare l'iscrizione, 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)
}