Logging API na urządzeniach mobilnych

Interfejs Logging API na urządzeniu mobilnym umożliwia aplikacji rejestrowanie kroków z urządzenia mobilnego przy oszczędzaniu baterii. Ten interfejs API nie jest rozliczany, co oznacza, że nie wymaga konto Google potrzebne do korzystania z usługi, a dane są przechowywane na urządzeniu.

Z tego przewodnika dowiesz się, jak korzystać z interfejsu Record API na urządzeniach mobilnych, dbając o zdrowie fitnessu.

Ważne informacje

Jest kilka ważnych funkcji, które są dostępne tylko w Recording API na urządzeniach mobilnych:

  • Po rozpoczęciu lub odnowieniu subskrypcji nagrania dane od ostatniego subskrypcja – na okres do 10 dni – jest dostępna.
  • Dane są dostępne tylko wtedy, gdy istnieje aktywna subskrypcja. Jeśli subskrypcja zostanie usunięte po wywołaniu funkcji unsubscribe, zebrane dane kroków będą niedostępne.

Typy danych

Interfejs Logging API na urządzeniach mobilnych może rejestrować te typy danych:

Rozpocznij

Aby rozpocząć, dodaj w pliku build.gradle tę zależność:

Kotlin DSL

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

...

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

Świetny DSL

apply plugin: 'com.android.application'

...

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

Poproś o uprawnienia

Aby rejestrować dane przy użyciu interfejsu Record API na urządzeniu mobilnym, aplikacja musi wysyłać żądania to uprawnienie:

  • android.permission.ACTIVITY_RECOGNITION

Sprawdzanie wersji Usług Google Play

Aby można było korzystać z interfejsu API nagrywania na urządzeniu mobilnym, użytkownik musi mieć Usługi Google Play Zaktualizowano do: LOCAL_RECORDING_CLIENT_MIN_VERSION_CODE. Możesz to sprawdzić za pomocą metody 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

W przeciwnym razie, jeśli wersja Usług Google Play użytkownika jest za stara, system wyrzuca ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED wyjątek.

Subskrybuj dane z aplikacji Fitness

Aby poprosić o zbieranie danych dotyczących kroków w tle, użyj subscribe zgodnie z tym fragmentem kodu:

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

Odczytywanie i przetwarzanie danych z aplikacji Fitness

Po zasubskrybowaniu poproś o dane za pomocą metody readData. Potem możesz: uzyskać LocalDataPoints z wynikowego LocalDataSet przez tworząc LocalDataReadRequest, jak pokazano w tym kodzie 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 stale aktualizuje swoje zbieranie danych. Dostępne opcje w każdej chwili możesz użyć funkcji readData, aby pobrać najnowsze dane.

Pamiętaj, że LocalRecordingClient przechowuje dane z maksymalnie 10 dni. Aby zmniejszyć ryzyko utraty danych, możesz używać WorkManagera, aby okresowo gromadzić dane w tle.

Anuluj subskrypcję danych o aktywności fizycznej

Aby zwolnić zasoby, nie zapomnij anulować subskrypcji zbieranie danych z czujnika, gdy aplikacja nie jest już potrzebna. Do anuluj subskrypcję, użyj metody 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)
  }