Mobil cihazlarda Kayıt API'sı

Mobil cihazlardaki Recording API'si, uygulamanızın bir mobil cihazdan adımları kaydetmesine olanak tanır pil tasarrufu sağlayabilir. Bu API hesapsızdır, yani hizmeti kullanmak için bir Google Hesabı oluşturabilirsiniz ve veriler cihazda depolanır.

Bu kılavuzda, fitness deneyimleridir.

Önemli ayrıntılar

Mobil cihazlarda Kayıt API'sına özgü birkaç önemli özellik vardır:

  • Kayıt aboneliği başladığında veya yenilendikten sonra, son kayıt tarihinden itibaren geçerli olan veriler 10 güne kadar süreyle erişilebilir olmalıdır.
  • Veriler yalnızca etkin bir abonelik olduğunda kullanılabilir. Abonelik unsubscribe çağrılarak kaldırılır. Toplanan adım verilerine erişilemeyecek.

Veri türleri

Mobil cihazlardaki Recording 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")
}

Eski DSL

apply plugin: 'com.android.application'

...

dependencies {
  implementation 'com.google.android.gms:play-services-fitness:21.2.0'
}

İzin iste

Mobil cihazlarda Recording API'yi kullanarak veri kaydetmek için uygulamanızın istekte bulunması gerekir. aşağıdaki izin:

  • android.permission.ACTIVITY_RECOGNITION

Play Hizmetleri sürüm kontrolü gerçekleştirme

Kayıt API'sini mobil cihazlarda kullanmak için kullanıcının Google Play Hizmetleri'ne sahip olması gerekir LOCAL_RECORDING_CLIENT_MIN_VERSION_CODE olarak güncellendi. Bunu kontrol edebilirsiniz. isGooglePlayServicesAvailable yöntemini kullanarak:

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

Aksi takdirde, kullanıcının Google Play Hizmetleri sürümü çok düşükse sistem, ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED atar kabul edersiniz.

Fitness Verilerine abone ol

Adım verilerinin arka planda toplanmasını istemek için subscribe yöntemini kullanın:

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

Fitness Verilerini Okuma ve İşleme

Abone olduktan sonra, readData yöntemini kullanarak verileri isteyin. Ardından, elde edilen LocalDataSet'den LocalDataPoints elde edin ve aşağıdaki kodda gösterildiği gibi bir LocalDataReadRequest oluşturarak snippet:

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, veri koleksiyonunu sürekli olarak günceller. Şunları yapabilirsiniz: İstediğiniz zaman en son rakamları almak için readData öğesini kullanın.

LocalRecordingClient en fazla 10 günlük veri depolar. Trafiği azaltmak için riskleri varsa, verileri belirli aralıklarla toplamak için WorkManager'ı görebilirsiniz.

Fitness verileri aboneliğinden çık

Kaynaklardan tasarruf etmek için veya uygulamanıza artık ihtiyaç duymadığında sensör verilerinin toplanması Alıcı: e-posta listesinden çıkmak için unsubscribe yöntemini kullanın:

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