Recording API auf Mobilgeräten

Mit der Recording API für Mobilgeräte kann Ihre App Schritte auf ähnliche Weise wie ein Schrittzähler auf einem Mobilgerät akkuschonend aufzeichnen. Diese API ist kontolos, d. h., es ist kein Google-Konto erforderlich, um den Dienst zu nutzen. Die Daten werden auf dem Gerät gespeichert.

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

Wichtige Details

Die Recording API bietet auf Mobilgeräten einige bemerkenswerte Funktionen:

  • Sobald das Aufzeichnungsabo beginnt oder verlängert wird, sind die Daten seit dem letzten Abo für bis zu 10 Tage verfügbar.
  • 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 mehr verfügbar.

Datentypen

Die Recording API auf Mobilgeräten kann die folgenden Datentypen aufzeichnen:

Erste Schritte

Fügen Sie der Datei build.gradle als Erstes die folgende Abhängigkeit hinzu:

Kotlin DSL

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

...

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

Groovy DSL

apply plugin: 'com.android.application'

...

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

Berechtigungen anfordern

Wenn Sie Daten mit der Recording API auf Mobilgeräten aufzeichnen möchten, muss Ihre App die folgende Berechtigung anfordern:

  • android.permission.ACTIVITY_RECOGNITION

Version der Play-Dienste prüfen

Wenn Nutzer die Recording API auf Mobilgeräten verwenden möchten, müssen die Google Play-Dienste auf LOCAL_RECORDING_CLIENT_MIN_VERSION_CODE aktualisiert sein. 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

Andernfalls, wenn die Version der Google Play-Dienste des Nutzers zu niedrig ist, wirft das System eine ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED-Ausnahme.

Fitnessdaten abonnieren

Wenn Sie die Hintergrunderfassung von Schrittdaten anfordern möchten, verwenden Sie die Methode 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 du dich angemeldet hast, kannst du die Daten mit der Methode readData anfordern. Anschließend können Sie LocalDataPoints aus dem resultierenden LocalDataSet abrufen, indem Sie LocalDataReadRequest ausführen, 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)}")
    }
  }
}

Die LocalRecordingClient aktualisiert ihre Datensammlung kontinuierlich. Mit readData können Sie jederzeit die neuesten Zahlen abrufen.

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

Fitnessdaten abbestellen

Um Ressourcen freizugeben, sollten Sie die Erfassung von Sensordaten deaktivieren, wenn Ihre App sie nicht mehr benötigt. Wenn Sie den Newsletter 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)
  }