API Recording sur mobile

L'API Recording sur mobile permet à votre application d'enregistrer les pas à partir d'un appareil mobile de manière économe en batterie. Cette API est sans compte : aucun compte Google n'est nécessaire pour utiliser le service, et les données sont stockées sur l'appareil.

Ce guide vous explique comment utiliser l'API Recording sur mobile dans vos expériences de santé et de remise en forme.

Détails importants

L'API Recording sur mobile présente plusieurs fonctionnalités notables:

  • Une fois l'abonnement d'enregistrement commencé, jusqu'à 10 jours de données sont stockés sur l'appareil.
  • Les données ne sont disponibles que lorsqu'un abonnement est actif. Si un abonnement est supprimé en appelant unsubscribe, les données sur les pas collectées ne seront pas accessibles.

Types de données

L'API Recording sur mobile peut enregistrer les types de données suivants:

Se lancer

Pour commencer, ajoutez la dépendance suivante dans votre fichier build.gradle:

DSL Kotlin

plugin {
  id("com.android.application")
}

...

dependencies {
  implementation("com.google.android.gms:play-services-fitness:21.2.0")
}

DSL groovy

apply plugin: 'com.android.application'

...

dependencies {
  implementation 'com.google.android.gms:play-services-fitness:21.2.0'
}

Demander des autorisations

Pour enregistrer des données à l'aide de l'API Recording sur mobile, votre application doit demander l'autorisation suivante:

  • android.permission.ACTIVITY_RECOGNITION

S'abonner aux données de fitness

Pour demander la collecte en arrière-plan des données sur les pas, la distance ou les calories, utilisez la méthode subscribe, comme indiqué dans l'extrait de code suivant:

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)
  }

Lire et traiter les données de fitness

Une fois abonné, demandez les données à l'aide de la méthode readData. Vous pouvez ensuite obtenir des DataPoints à partir de l'ensemble de données obtenu en effectuant une requête DataReadRequest, comme indiqué dans l'extrait de code suivant:

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 met continuellement à jour sa collecte de données. Vous pouvez utiliser readData pour extraire les derniers chiffres à tout moment.

Notez que LocalRecordingClient stocke jusqu'à 10 jours de données. Pour réduire le risque de perte de données, vous pouvez utiliser WorkManager pour collecter régulièrement les données en arrière-plan.

Se désabonner des données de fitness

Pour libérer des ressources, assurez-vous de vous désabonner de la collecte des données de capteurs lorsque votre application n'en a plus besoin. Pour vous désabonner, utilisez la méthode 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)
  }