API Recording su dispositivi mobili

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.

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