Mobil cihazlardaki Kayıt API'si, uygulamanızın mobil cihazdaki adımları pil tasarrufu sağlayacak şekilde kaydetmesine olanak tanır. Bu API hesapsızdır. Yani hizmeti kullanmak için Google Hesabı gerektirmez ve veriler cihazda depolanır.
Bu kılavuzda, sağlık ve fitness deneyimlerinizde mobil cihazlarda Kayıt API'sini nasıl kullanacağınız gösterilmektedir.
Önemli ayrıntılar
Mobil cihazlardaki Kayıt API'sına özgü bazı önemli özellikler vardır:
- Kayıt aboneliği başladıktan sonra en fazla 10 günlük veriler cihazda depolanır.
- Veriler yalnızca etkin bir abonelik olduğunda kullanılabilir. Bir abonelik,
unsubscribe
çağrısı yapılarak kaldırılırsa toplanan adım verilerine erişilemez.
Veri türleri
Mobil cihazlarda Kayıt API'si aşağıdaki veri türlerini kaydedebilir:
Başlayın
Başlamak için build.gradle
dosyanıza aşağıdaki bağımlılığı ekleyin:
Kotlin DSL
plugin {
id("com.android.application")
}
...
dependencies {
implementation("com.google.android.gms:play-services-fitness:21.2.0")
}
Modern DSL
apply plugin: 'com.android.application'
...
dependencies {
implementation 'com.google.android.gms:play-services-fitness:21.2.0'
}
İzin iste
Mobil cihazlarda Kayıt API'sini kullanarak veri kaydetmek için uygulamanızın aşağıdaki izni istemesi gerekir:
android.permission.ACTIVITY_RECOGNITION
Fitness Verilerine Abone Ol
Adım, mesafe veya kalori verilerinin arka planda toplanmasını istemek için aşağıdaki kod snippet'inde gösterildiği gibi subscribe
yöntemini kullanın:
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)
}
Fitness Verilerini Okuma ve İşleme
Abone olduktan sonra, readData
yöntemini kullanarak verileri isteyin. Ardından, aşağıdaki kod snippet'inde gösterildiği gibi bir DataReadRequest oluşturarak sonuçta elde edilen DataSet'ten DataPoint'ler elde edebilirsiniz:
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)}")
}
}
}
LocalRecordingClient
, veri toplama işlemini sürekli olarak günceller. İstediğiniz zaman en son sayıları almak için readData'yı kullanabilirsiniz.
LocalRecordingClient
öğesinin en fazla 10 günlük verileri depoladığını unutmayın. Veri kaybı riskini azaltmak için WorkManager'ı kullanarak verileri arka planda düzenli olarak toplayabilirsiniz.
Fitness verileri aboneliğinden çık
Kaynaklardan tasarruf etmek için, uygulamanızın artık ihtiyaç duymadığı sensör verileri toplama aboneliğinden çıkmanız gerekir. E-posta listesinden çıkmak için unsubscribe
yöntemini kullanın:
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)
}