La API de grabación en dispositivos móviles permite que tu app registre pasos desde un dispositivo móvil de manera eficiente en términos de batería. Esta API no cuenta con cuentas, lo que significa que no requiere una Cuenta de Google para usar el servicio y los datos se almacenan en el dispositivo.
En esta guía, se muestra cómo usar la API de grabación en dispositivos móviles en tus experiencias de salud y bienestar.
Detalles destacados
Existen varias funciones notables exclusivas de la API de grabación en dispositivos móviles:
- Una vez que comience la suscripción de grabación, se almacenarán hasta 10 días de datos en el dispositivo.
- Los datos solo están disponibles cuando hay una suscripción activa. Si se quita una suscripción llamando a
unsubscribe
, no se podrá acceder a los datos de pasos recopilados.
Tipos de datos
La API de grabación en dispositivos móviles puede registrar los siguientes tipos de datos:
Primeros pasos
Para comenzar, agrega la siguiente dependencia en tu archivo build.gradle
:
DSL de Kotlin
plugin {
id("com.android.application")
}
...
dependencies {
implementation("com.google.android.gms:play-services-fitness:21.2.0")
}
DSL genial
apply plugin: 'com.android.application'
...
dependencies {
implementation 'com.google.android.gms:play-services-fitness:21.2.0'
}
Solicita permisos
Para grabar datos con la API de grabación en dispositivos móviles, tu app deberá solicitar el siguiente permiso:
android.permission.ACTIVITY_RECOGNITION
Suscribirse a los datos de Fitness
Para solicitar la recopilación en segundo plano de datos de pasos, distancia o calorías, usa el método subscribe
, como se muestra en el siguiente fragmento de código:
val localRecordingClient = FitnessLocal.getLocalRecordingClient(this)
// Subscribe to steps data
localRecordingClient.subscribe(DataType.TYPE_STEP_COUNT_DELTA)
.addOnSuccessListener {
Log.i(TAG, "Successfully subscribed!")
}
.addOnFailureListener { e ->
Log.w(TAG, "There was a problem subscribing.", e)
}
Leer y procesar datos de Fitness
Una vez que te suscribas, solicita los datos con el método readData
. Luego, puedes obtener DataPoints del DataSet resultante mediante una DataReadRequest como se muestra en el siguiente fragmento de código:
val endTime = LocalDateTime.now().atZone(ZoneId.systemDefault())
val startTime = endTime.minusWeeks(1)
val readRequest =
DataReadRequest.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(DataType.AGGREGATE_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: DataSet) {
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.getStartTimeString()}")
Log.i(TAG,"\tEnd: ${dp.getEndTimeString()}")
for (field in dp.dataType.fields) {
Log.i(TAG,"\tField: ${field.name.toString()} Value: ${dp.getValue(field)}")
}
}
}
LocalRecordingClient
actualiza de forma continua su colección de datos. Puedes usar readData para obtener los números más recientes en cualquier momento.
Ten en cuenta que LocalRecordingClient
almacena hasta 10 días de datos. A fin de reducir el riesgo de perder datos, puedes usar WorkManager para recopilar periódicamente los datos en segundo plano.
Anular la suscripción a los datos de entrenamiento
Para liberar recursos, debes asegurarte de anular la suscripción a la recopilación de datos de sensores cuando tu app ya no los necesite. Para anular la suscripción, usa el método unsubscribe
:
val localRecordingClient = FitnessLocal.getLocalRecordingClient(this)
// Unsubscribe from steps data
localRecordingClient.unsubscribe(DataType.TYPE_STEP_COUNT_DELTA)
.addOnSuccessListener {
Log.i(TAG, "Successfully unsubscribed!")
}
.addOnFailureListener { e ->
Log.w(TAG, "There was a problem unsubscribing.", e)
}