Recording API auf Mobilgeräten

Mit der Recording API auf Mobilgeräten kann deine App Schritte von einem Mobilgerät akkusparend aufzeichnen. Diese API ist kontolos, 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 Gesundheit und Fitness verwenden kannst.

Wichtige Details

Es gibt einige bemerkenswerte Funktionen, die nur die Recording API auf Mobilgeräten bietet:

  • Nach Beginn des Aufzeichnungsabos werden Daten von bis zu 10 Tagen auf dem Gerät gespeichert.
  • Daten sind nur verfügbar, wenn ein aktives Abo vorhanden ist. Wenn ein Abo durch Aufrufen von unsubscribe entfernt wird, sind erfasste Schrittdaten nicht mehr zugänglich.

Datentypen

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

Erste Schritte

Fügen Sie der Datei build.gradle zuerst 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

Um Daten mit der Recording API auf Mobilgeräten aufzuzeichnen, muss deine App die folgende Berechtigung anfordern:

  • android.permission.ACTIVITY_RECOGNITION

Fitnessdaten abonnieren

Wenn Sie im Hintergrund die Erfassung von Schritten, Entfernungen oder Kaloriendaten 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(DataType.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 das Abo abgeschlossen hast, kannst du die Daten mit der Methode readData anfordern. Anschließend können Sie DataPoints aus dem resultierenden DataSet abrufen, indem Sie DataReadRequest ausführen, wie im folgenden Code-Snippet gezeigt:

val endTime = LocalDateTime.now().atZone(ZoneId.systemDefault())
val startTime = endTime.minusWeeks(1)
val readRequest =
  DataReadRequest.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(DataType.AGGREGATE_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: DataSet) {
  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.getStartTimeString()}")
    Log.i(TAG,"\tEnd: ${dp.getEndTimeString()}")
    for (field in dp.dataType.fields) {
      Log.i(TAG,"\tField: ${field.name.toString()} Value: ${dp.getValue(field)}")
    }
  }
}

Die Datenerhebung von LocalRecordingClient wird kontinuierlich aktualisiert. Sie können readData jederzeit verwenden, um die neuesten Zahlen abzurufen.

In LocalRecordingClient werden Daten von bis zu 10 Tagen gespeichert. Um das Risiko eines Datenverlusts zu verringern, können Sie mit WorkManager die Daten regelmäßig im Hintergrund erfassen.

Keine Fitnessdaten mehr erhalten

Um Ressourcen freizugeben, sollten Sie die Erfassung von Sensordaten beenden, wenn Ihre App diese nicht mehr benötigt. Verwenden Sie zum Abbestellen die Methode unsubscribe:

val localRecordingClient = FitnessLocal.getLocalRecordingClient(this)
// Unsubscribe from steps data
localRecordingClient.unsubscribe(DataType.TYPE_STEP_COUNT_DELTA)
  .addOnSuccessListener {
    Log.i(TAG, "Successfully unsubscribed!")
  }
  .addOnFailureListener { e ->
    Log.w(TAG, "There was a problem unsubscribing.", e)
  }