API Recording su dispositivi mobili

L'API Recording su dispositivo mobile consente alla tua app di registrare i passi da un dispositivo mobile a basso consumo. Questa API è senza account, ovvero non richiede un Account Google per usare il servizio e i dati vengono memorizzati sul dispositivo.

Questa guida ti mostra come usare l'API Recording su dispositivi mobili in ambito sanitario e esperienze di fitness.

Dettagli importanti

L'API Recording sui dispositivi mobili offre diverse funzionalità degne di nota, specifiche per:

  • Una volta che l'abbonamento alla registrazione inizia o viene rinnovato, i dati a partire dall'ultima abbonamento, per un massimo di 10 giorni, sia accessibile.
  • I dati sono disponibili solo quando è presente un abbonamento attivo. Se un abbonamento viene rimosso chiamando unsubscribe, i dati dei passi raccolti non saranno accessibili.

Tipi di dati

L'API Recording su dispositivo mobile 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

Esegui un controllo della versione di Play Services

Per utilizzare l'API Recording sui dispositivi mobili, l'utente deve avere Google Play Services aggiornato a LOCAL_RECORDING_CLIENT_MIN_VERSION_CODE. Puoi verificare 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

Altrimenti, se la versione di Google Play Services in uso è troppo vecchia, il sistema genera un ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED .

Iscriviti a Dati di fitness

Per richiedere la raccolta in background di dati sui passi, utilizza la 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

Dopo aver effettuato l'iscrizione, richiedi i dati utilizzando il metodo readData. Poi potrai ottenere LocalDataPoints dal risultato LocalDataSet tramite creando un LocalDataReadRequest, come mostrato nel seguente codice snippet:

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

Tieni presente che LocalRecordingClient memorizza fino a 10 giorni di dati. Per ridurre il di perdere dati, puoi usare WorkManager per raccogliere periodicamente i dati sullo sfondo.

Annulla l'iscrizione ai dati relativi all'attività fisica

Per liberare risorse, devi assicurarti di annullare l'iscrizione al raccolta dei dati dei sensori quando l'app non ne ha più bisogno. A annulla l'iscrizione, usa 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)
  }