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