Recording API auf Mobilgeräten

Mit der Recording API auf Mobilgeräten kann Ihre App Schritte von einem Mobilgerät akkusparend aufzeichnen. Diese API ist ohne Konten verknüpft, d. h., zur Nutzung des Dienstes ist kein Google-Konto erforderlich und die Daten werden auf dem Gerät gespeichert.

In diesem Leitfaden erfährst du, wie du die Recording API auf Mobilgeräten für Gesundheits- und Fitnessfunktionen verwenden kannst.

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, sind die Daten seit dem letzten Abo für bis zu zehn Tage verfügbar.
  • Daten sind nur verfügbar, wenn ein aktives Abo vorhanden ist. Wenn ein Abo durch den Aufruf 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 deine App die folgende Berechtigung anfordern:

  • android.permission.ACTIVITY_RECOGNITION

Play-Dienste-Versionsprüfung durchführen

Damit der Nutzer die Recording API auf einem Mobilgerät verwenden kann, muss der Nutzer die Google Play-Dienste auf LOCAL_RECORDING_CLIENT_MIN_VERSION_CODE aktualisiert haben. Sie können dies mit der Methode isGooglePlayServicesAvailable prüfen:

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

Ist die Version der Google Play-Dienste des Nutzers zu niedrig, wird vom System die Ausnahme ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED ausgelöst.

Fitnessdaten abonnieren

Verwende die subscribe-Methode, wie im folgenden Code-Snippet gezeigt, um die Erhebung von Daten zu Schritten, Strecken oder Kalorien im Hintergrund anzufordern:

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 LocalDataPoints aus dem resultierenden LocalDataSet abrufen, indem Sie ein LocalDataReadRequest-Objekt erstellen, wie im folgenden Code-Snippet gezeigt:

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 die aktuellen Zahlen jederzeit mit readData abrufen.

Hinweis: LocalRecordingClient speichert bis zu 10 Tage an Daten. Um das Risiko von Datenverlusten zu verringern, können Sie die Daten mit WorkManager regelmäßig im Hintergrund erfassen.

Von Fitnessdaten abmelden

Wenn Sie Ressourcen freigeben möchten, sollten Sie die Erfassung von Sensordaten beenden, wenn Ihre App sie nicht mehr benötigt. Wenn Sie sie abbestellen möchten, verwenden Sie die Methode 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)
  }