Mobil cihazlarda Kayıt API'sı

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