Merekam data kebugaran menggunakan Recording API

Recording API di perangkat seluler memungkinkan aplikasi Anda merekam data kebugaran dari perangkat seluler secara efisien baterai. Misalnya, gunakan API ini untuk mencatat langkah, mirip dengan pedometer yang mengambil data jumlah langkah. API ini tidak memerlukan akun, artinya tidak memerlukan Akun Google untuk menggunakan layanan, dan data disimpan di perangkat.

Panduan ini menunjukkan cara menggunakan Recording API di perangkat seluler dalam pengalaman kesehatan & kebugaran Anda.

Lihat contoh Recording API di perangkat seluler di GitHub untuk mengetahui contohnya.

Detail penting

Ada beberapa fitur penting yang unik untuk Recording API di perangkat seluler:

  • Setelah langganan perekaman dimulai atau diperpanjang, data sejak langganan terakhir - hingga 10 hari - dapat diakses.
  • Data hanya tersedia jika ada langganan aktif. Jika langganan dihapus dengan memanggil unsubscribe, data 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

Melakukan pemeriksaan versi Layanan Play

Untuk menggunakan Recording API di perangkat seluler, pengguna harus mengupdate layanan Google Play ke LOCAL_RECORDING_CLIENT_MIN_VERSION_CODE. Anda dapat memeriksa hal ini menggunakan metode isGooglePlayServicesAvailable:

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

Jika tidak, jika versi layanan Google Play pengguna terlalu rendah, sistem akan menampilkan pengecualian ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED.

Berlangganan Data Kebugaran

Untuk meminta pengumpulan data langkah di latar belakang, gunakan metode subscribe, seperti yang ditunjukkan dalam cuplikan kode berikut:

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

Membaca dan Memproses Data Kebugaran

Setelah berlangganan, minta data menggunakan metode readData. Kemudian, Anda dapat mendapatkan LocalDataPoints dari LocalDataSet yang dihasilkan dengan membuat LocalDataReadRequest, seperti yang ditunjukkan dalam cuplikan kode berikut:

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

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 mengumpulkan data secara berkala di latar belakang.

Berhenti berlangganan data kebugaran

Untuk mengosongkan resource, Anda harus memastikan untuk berhenti berlangganan dari pengumpulan data sensor saat aplikasi Anda tidak lagi memerlukannya. Untuk berhenti berlangganan, gunakan metode 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)
  }