Recording API auf Mobilgeräten

Mit der Recording API auf Mobilgeräten kann deine App Schritte von einem Mobilgerät aus aufzeichnen um den Akku zu schonen. Diese API ist ohne Konten, ein Google-Konto haben, um den Dienst zu nutzen, und die Daten werden auf dem Gerät gespeichert.

In diesem Leitfaden erfahren Sie, wie Sie die Recording API auf Mobilgeräten in Ihrem Gesundheits- und Fitness-Erlebnisse.

Wichtige Details

Es gibt mehrere wichtige Funktionen, die nur bei der Recording API auf Mobilgeräten verfügbar sind:

  • Sobald das Aufzeichnungsabo beginnt oder verlängert wird, werden die Daten seit dem letzten für bis zu 10 Tage verfügbar ist.
  • Daten sind nur verfügbar, wenn ein aktives Abo vorhanden ist. Wenn ein Abo durch Aufrufen von unsubscribe entfernt wird, sind die erfassten Schrittdaten nicht verfügbar.

Datentypen

Mit der Recording API auf Mobilgeräten können die folgenden Datentypen aufgezeichnet werden:

Erste Schritte

Fügen Sie zuerst die folgende Abhängigkeit in Ihre build.gradle-Datei ein:

Kotlin DSL

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

...

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

Grooviges DSL

apply plugin: 'com.android.application'

...

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

Berechtigungen anfordern

Um Daten mit der Recording API auf einem Mobilgerät aufzuzeichnen, muss Ihre App die die folgende Berechtigung hat:

  • android.permission.ACTIVITY_RECOGNITION

Play-Dienste-Versionsprüfung durchführen

Damit der Nutzer die Recording API auf einem Mobilgerät verwenden kann, muss er Google Play-Dienste haben. aktualisiert auf LOCAL_RECORDING_CLIENT_MIN_VERSION_CODE. Sie können das prüfen, mithilfe der Methode 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

Wenn die Version der Google Play-Dienste für den Nutzer zu niedrig ist, wirft ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED Ausnahme.

Fitnessdaten abonnieren

Wenn du die Erhebung von Schrittdaten im Hintergrund anfordern möchtest, verwende die subscribe, wie im folgenden Code-Snippet gezeigt:

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

Fitnessdaten lesen und verarbeiten

Nachdem Sie das Abo abgeschlossen haben, können Sie die Daten mit der Methode readData anfordern. Anschließend können Sie Abrufen von LocalDataPoints aus dem resultierenden LocalDataSet durch eine LocalDataReadRequest erstellen, wie im folgenden Code gezeigt 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 aktualisiert die Sammlung von Daten kontinuierlich. Sie können Sie können jederzeit readData verwenden, um die neuesten Zahlen abzurufen.

Hinweis: LocalRecordingClient speichert bis zu 10 Tage an Daten. Um die Anzahl der des Verlusts von Daten besteht, können Sie WorkManager verwenden, um die Daten in regelmäßigen Abständen im Hintergrund.

Von Fitnessdaten abmelden

Wenn Sie Ressourcen freigeben möchten, sollten Sie sich von den Erhebung von Sensordaten, wenn Ihre App diese nicht mehr benötigt. Bis können Sie dies mit der Methode unsubscribe beenden:

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