הקלטה API בנייד

Recording API בנייד מאפשר לאפליקציה לתעד שלבים ממכשיר נייד בצורה חסכונית בסוללה. ה-API הזה חסר חשבון, כלומר הוא לא מחייב לחשבון Google שבו ניתן להשתמש בשירות והנתונים מאוחסנים במכשיר.

במדריך הזה תלמדו איך להשתמש ב-Record API בנייד במצב בריאותי חוויות כושר גופני.

פרטים חשובים

יש כמה תכונות ייחודיות ל-Record API בנייד:

  • לאחר שהמינוי להקלטה יתחיל או יתחדש, הנתונים מאז המינוי - לתקופה של עד 10 ימים - הוא נגיש.
  • הנתונים זמינים רק כשיש מינוי פעיל. אם מדובר במינוי מוסרת על ידי קריאה אל unsubscribe, נתוני השלבים שנאספו לא יהיו נגישים.

סוגי הנתונים

Recording API בנייד יכול לתעד את סוגי הנתונים הבאים:

שנתחיל?

כדי להתחיל, צריך להוסיף את התלות הבאה לקובץ build.gradle:

Kotlin DSL

plugin {
  id("com.android.application")
}

...

dependencies {
  implementation("com.google.android.gms:play-services-fitness:21.2.0")
}

DSL מדליק

apply plugin: 'com.android.application'

...

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

בקשת הרשאות

כדי להקליט נתונים באמצעות Recording API בנייד, האפליקציה שלך תצטרך לבקש את ההרשאה הבאה:

  • android.permission.ACTIVITY_RECOGNITION

בדיקת הגרסה של Play Services

כדי להשתמש ב-Record API בנייד, למשתמש צריכים להיות שירותי Google Play Services עודכן לתאריך LOCAL_RECORDING_CLIENT_MIN_VERSION_CODE. אפשר לבדוק את זה באמצעות השיטה 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

אחרת, אם גרסת Google Play Services של המשתמש נמוכה מדי, המערכת מחזירה ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED חריג.

הרשמה לנתוני כושר

כדי לבקש איסוף של נתוני שלבים ברקע, צריך להשתמש בפונקציה subscribe, כפי שמוצג בקטע הקוד הבא:

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

קריאה ועיבוד של נתוני כושר

לאחר ההרשמה, מבקשים את הנתונים באמצעות השיטה readData. לאחר מכן תוכלו: לקבל LocalDataPoints מהפונקציה LocalDataSet שמתקבלת יוצר LocalDataReadRequest, כמו שמוצג בקוד הבא 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 מתעדכן כל הזמן. אפשר אפשר להשתמש בפונקציה readData כדי לשלוף את המספרים העדכניים בכל שלב.

לתשומת ליבך: ב-LocalRecordingClient נשמרים נתונים של עד 10 ימים. כדי להפחית את של אובדן נתונים, ניתן להשתמש ב-WorkManager כדי לאסוף מדי פעם את הנתונים את הרקע.

ביטול ההרשמה לנתוני כושר

כדי לפנות משאבים, מומלץ לבטל את ההרשמה איסוף של נתוני חיישנים כשהאפליקציה כבר לא צריכה אותם. שפת תרגום לבטל את ההרשמה, משתמשים בשיטה 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)
  }