API Recording su dispositivi mobili

L'API Recording su dispositivo mobile consente alla tua app di registrare i passi da un dispositivo mobile con un basso consumo della 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 mostra come utilizzare l'API Recording su dispositivo mobile nelle tue esperienze di salute e fitness.

Dettagli importanti

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

  • Una volta che l'abbonamento per la registrazione inizia o viene rinnovato, i dati a partire dall'ultimo abbonamento (per un massimo di 10 giorni) sono accessibili.
  • 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 su dispositivi mobili, l'utente deve aggiornare Google Play Services alla versione LOCAL_RECORDING_CLIENT_MIN_VERSION_CODE. Puoi verificarlo 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 vecchia, il sistema genera un'eccezione ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED.

Iscriviti a Dati di fitness

Per richiedere la raccolta in background di dati su 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(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. Quindi, puoi ottenere LocalDataPoint dalla LocalDataSet risultante creando un LocalDataReadRequest, come mostrato nel seguente snippet di codice:

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 utilizzare readData per estrarre i numeri più recenti in qualsiasi momento.

Tieni presente che LocalRecordingClient memorizza fino a 10 giorni di dati. Per ridurre il rischio di perdere dati, puoi utilizzare WorkManager per raccogliere periodicamente i dati in background.

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

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