Recording API di perangkat seluler memungkinkan aplikasi Anda merekam langkah dari perangkat seluler dengan cara yang hemat baterai. API ini tidak memiliki akun, artinya tidak memerlukan Akun Google untuk menggunakan layanan dan data disimpan di perangkat.
Panduan ini menunjukkan cara menggunakan Recording API di perangkat seluler untuk pengalaman kesehatan & kebugaran Anda.
Detail penting
Ada beberapa fitur penting yang unik untuk Recording API di perangkat seluler:
- Setelah langganan perekaman dimulai, data hingga 10 hari akan disimpan di perangkat.
- Data hanya tersedia jika ada langganan yang aktif. Jika langganan
dihapus dengan memanggil
unsubscribe
, data langkah yang dikumpulkan tidak akan dapat diakses.
Jenis data
Recording API di perangkat seluler dapat merekam jenis data berikut:
Mulai
Untuk memulai, tambahkan dependensi berikut di file build.gradle
Anda:
DSL Kotlin
plugin {
id("com.android.application")
}
...
dependencies {
implementation("com.google.android.gms:play-services-fitness:21.2.0")
}
DSL Groovy
apply plugin: 'com.android.application'
...
dependencies {
implementation 'com.google.android.gms:play-services-fitness:21.2.0'
}
Meminta izin
Untuk merekam data menggunakan Recording API di perangkat seluler, aplikasi Anda harus meminta izin berikut:
android.permission.ACTIVITY_RECOGNITION
Berlangganan Data Kebugaran
Untuk meminta pengumpulan data langkah, jarak, atau kalori di latar belakang, gunakan
metode subscribe
, seperti ditunjukkan dalam cuplikan kode berikut:
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)
}
Membaca dan Memproses Data Kebugaran
Setelah berlangganan, minta data menggunakan metode readData
. Kemudian, Anda dapat
mendapatkan DataPoints dari DataSet yang dihasilkan dengan membuat
DataReadRequest seperti yang ditunjukkan dalam cuplikan kode berikut:
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
terus memperbarui pengumpulan datanya. Anda dapat
menggunakan readData untuk menarik angka terbaru kapan saja.
Perhatikan bahwa LocalRecordingClient
menyimpan data hingga 10 hari. Untuk mengurangi
risiko kehilangan data, Anda dapat menggunakan WorkManager untuk secara berkala mengumpulkan data di
latar belakang.
Berhenti berlangganan data kebugaran
Untuk mengosongkan resource, pastikan Anda berhenti berlangganan
pengumpulan data sensor saat aplikasi tidak lagi membutuhkannya. Untuk
berhenti berlangganan, gunakan metode 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)
}