API Recording su dispositivi mobili

L'API Recording su dispositivi mobili consente alla tua app di registrare i passi da un dispositivo mobile in modo efficiente dalla batteria. Questa API è senza account, ovvero non richiede un Account Google per utilizzare il servizio e i dati vengono memorizzati sul dispositivo.

Questa guida ti mostra come utilizzare l'API Recording su dispositivi mobili per migliorare le tue esperienze di salute e fitness.

Dettagli importanti

Esistono diverse funzionalità degne di nota specifiche dell'API Recording su dispositivi mobili:

  • Una volta avviato l'abbonamento per la registrazione, sul dispositivo vengono archiviati i dati per un massimo di 10 giorni.
  • I dati sono disponibili solo quando è presente un abbonamento attivo. Se un abbonamento viene rimosso chiamando unsubscribe, i dati sui 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 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

Iscriviti ai dati relativi all'attività fisica

Per richiedere la raccolta di dati in background relativi a passi, distanza o calorie, utilizza il metodo subscribe, come mostrato nel seguente snippet di codice:

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

Leggere ed elaborare i dati di fitness

Dopo aver sottoscritto l'abbonamento, richiedi i dati utilizzando il metodo readData. Poi, puoi ottenere DataPoints dal Set di dati risultante creando una DataReadRequest come mostrato nel seguente snippet di codice:

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 aggiorna continuamente la propria raccolta di dati. Puoi utilizzare readData per estrarre i numeri più recenti in qualsiasi momento.

Tieni presente che l'LocalRecordingClient archivia fino a 10 giorni di dati. Per ridurre il rischio di perdere dati, puoi utilizzare WorkManager per raccoglierli periodicamente in background.

Annulla l'iscrizione ai dati sull'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 annullare l'iscrizione, utilizza il metodo 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)
  }