রেকর্ডিং API ব্যবহার করে ফিটনেস ডেটা রেকর্ড করুন

মোবাইলের রেকর্ডিং এপিআই আপনার অ্যাপকে ব্যাটারি সাশ্রয়ী উপায়ে মোবাইল ডিভাইস থেকে ফিটনেস ডেটা রেকর্ড করার সুযোগ দেয়। উদাহরণস্বরূপ, পেডোমিটারের স্টেপ কাউন্ট ডেটা সংগ্রহের মতোই, পদক্ষেপ রেকর্ড করতে এই এপিআই ব্যবহার করুন। এই এপিআইটি অ্যাকাউন্টবিহীন, অর্থাৎ পরিষেবাটি ব্যবহার করার জন্য কোনো গুগল অ্যাকাউন্টের প্রয়োজন হয় না এবং ডেটা ডিভাইসেই সংরক্ষিত থাকে।

আপনার অ্যাপের যদি ডিভাইসের স্টেপস ছাড়াও বিভিন্ন উৎস থেকে অন্যান্য স্বাস্থ্য ও ফিটনেস ডেটা পড়ার প্রয়োজন হয়, তাহলে হেলথ কানেক্ট-এর সাথে ইন্টিগ্রেট করা একটি ভালো বিকল্প। হেলথ কানেক্ট অ্যান্ড্রয়েড ১৪ (এপিআই লেভেল ৩৪) এবং এর পরবর্তী সংস্করণগুলোতে নেটিভভাবে ডিভাইসের স্টেপস অ্যাক্সেসের সুবিধাও প্রদান করে।

এই নির্দেশিকাটি আপনাকে দেখাবে কীভাবে আপনার স্বাস্থ্য ও ফিটনেস সংক্রান্ত অভিজ্ঞতায় মোবাইলে রেকর্ডিং এপিআই ব্যবহার করতে হয়।

একটি উদাহরণের জন্য গিটহাবে মোবাইলের জন্য রেকর্ডিং এপিআই নমুনাটি দেখুন।

উল্লেখযোগ্য বিবরণ

মোবাইলের রেকর্ডিং এপিআই-এর বেশ কিছু উল্লেখযোগ্য ও স্বতন্ত্র বৈশিষ্ট্য রয়েছে:

  • রেকর্ডিং সাবস্ক্রিপশন শুরু বা নবায়ন করা হলে, সর্বশেষ সাবস্ক্রিপশনের সময় থেকে সর্বোচ্চ ১০ দিনের ডেটা অ্যাক্সেস করা যায়।
  • শুধুমাত্র একটি সক্রিয় সাবস্ক্রিপশন থাকলেই ডেটা পাওয়া যায়। যদি unsubscribe কল করে কোনো সাবস্ক্রিপশন বাতিল করা হয়, তাহলে সংগৃহীত ডেটা আর অ্যাক্সেসযোগ্য থাকবে না।

ডেটা টাইপ

মোবাইলের রেকর্ডিং এপিআই নিম্নলিখিত ডেটা টাইপগুলি রেকর্ড করতে পারে:

শুরু করুন

শুরু করার জন্য, আপনার build.gradle ফাইলে নিম্নলিখিত ডিপেন্ডেন্সিটি যোগ করুন:

কোটলিন ডিএসএল

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

...

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

গ্রুভি ডিএসএল

apply plugin: 'com.android.application'

...

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

অনুমতির জন্য অনুরোধ করুন

মোবাইলে রেকর্ডিং এপিআই ব্যবহার করে ডেটা রেকর্ড করতে, আপনার অ্যাপকে নিম্নলিখিত অনুমতির জন্য অনুরোধ করতে হবে:

  • android.permission.ACTIVITY_RECOGNITION

প্লে সার্ভিসেস সংস্করণ পরীক্ষা করুন

মোবাইলে রেকর্ডিং এপিআই ব্যবহার করার জন্য, ব্যবহারকারীকে অবশ্যই গুগল প্লে সার্ভিসেস 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

অন্যথায়, ব্যবহারকারীর গুগল প্লে সার্ভিসেস ভার্সন খুব পুরোনো হলে, সিস্টেমটি একটি 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 মেথড ব্যবহার করে ডেটার জন্য অনুরোধ করুন। তারপর, নিচের কোড স্নিপেটে দেখানো অনুযায়ী, একটি LocalDataReadRequest করার মাধ্যমে প্রাপ্ত LocalDataSet থেকে LocalDataPoints সংগ্রহ করতে পারবেন:

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 সর্বোচ্চ ১০ দিনের ডেটা সংরক্ষণ করে। ডেটা হারানোর ঝুঁকি কমাতে, আপনি ব্যাকগ্রাউন্ডে পর্যায়ক্রমে ডেটা সংগ্রহ করার জন্য 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)
  }