হেলথ কানেক্টের সাথে ওয়ার্কআউট অভিজ্ঞতা বিকাশ করুন

আপনি যদি আপনার অ্যাপে একটি ওয়ার্কআউট অভিজ্ঞতা তৈরি করতে চান, তাহলে হেলথ কানেক্ট ব্যবহার করে নিম্নলিখিত কাজগুলো করতে পারেন:

  • ব্যায়াম সেশন লিখুন
  • ওয়ার্কআউট রুট লিখুন
  • ওয়ার্কআউটের মেট্রিক যেমন হৃদস্পন্দন, গতি এবং দূরত্ব লিখুন।
  • অন্যান্য অ্যাপ থেকে ওয়ার্কআউটের ডেটা পড়ুন

এই নির্দেশিকায় ডেটা টাইপ, ব্যাকগ্রাউন্ড এক্সিকিউশন, পারমিশন, প্রস্তাবিত ওয়ার্কফ্লো এবং সেরা অনুশীলন সহ এই ওয়ার্কআউট ফিচারগুলি কীভাবে তৈরি করতে হয় তা বর্ণনা করা হয়েছে।

সারসংক্ষেপ: একটি পূর্ণাঙ্গ ওয়ার্কআউট ট্র্যাকার তৈরি করা

এই মূল ধাপগুলো অনুসরণ করে আপনি হেলথ কানেক্ট ব্যবহার করে একটি পূর্ণাঙ্গ ওয়ার্কআউট ট্র্যাকিং অভিজ্ঞতা তৈরি করতে পারেন:

  • স্বাস্থ্য অনুমতির উপর ভিত্তি করে অনুমতিগুলো সঠিকভাবে প্রয়োগ করা হচ্ছে।
  • ExerciseSessionRecord ব্যবহার করে সেশন রেকর্ড করা হচ্ছে।
  • সেশন চলাকালীন ধারাবাহিকভাবে ওয়ার্কআউটের ডেটা লেখা।
  • নিরবচ্ছিন্ন ডেটা ক্যাপচার যাচাই করার জন্য ব্যাকগ্রাউন্ড এক্সিকিউশন সঠিকভাবে পরিচালনা করা।
  • ব্যায়াম-পরবর্তী সারাংশ ও বিশ্লেষণের জন্য সেশনের ডেটা পড়া।

এই কর্মপ্রবাহটি অন্যান্য হেলথ কানেক্ট অ্যাপের সাথে আন্তঃকার্যক্ষমতা সক্ষম করে এবং ব্যবহারকারী-নিয়ন্ত্রিত ডেটা অ্যাক্সেস যাচাই করে।

শুরু করার আগে

ওয়ার্কআউট ফিচারগুলো প্রয়োগ করার আগে:

মূল ধারণা

হেলথ কানেক্ট কয়েকটি মূল উপাদান ব্যবহার করে ওয়ার্কআউটের ডেটা উপস্থাপন করে। একটি ExerciseSessionRecord একটি ওয়ার্কআউটের কেন্দ্রীয় রেকর্ড হিসেবে কাজ করে, যাতে শুরু বা শেষের সময় এবং ব্যায়ামের ধরনের মতো বিবরণ থাকে। একটি সেশন চলাকালীন, HeartRateRecord বা SpeedRecord -এর মতো বিভিন্ন ধরনের ডেটা রেকর্ড করা যেতে পারে। বাইরের কার্যকলাপের জন্য, ExerciseRoute জিপিএস ডেটা সংরক্ষণ করে, যা এর সংশ্লিষ্ট সেশনের সাথে সংযুক্ত থাকে।

ব্যায়াম সেশন

ExerciseSessionRecord হলো ওয়ার্কআউট ডেটার কেন্দ্রীয় রেকর্ড, যা একটি একক ওয়ার্কআউট সেশনকে প্রতিনিধিত্ব করে। প্রতিটি রেকর্ডে সংরক্ষিত থাকে:

  • startTime
  • endTime
  • exerciseType
  • ঐচ্ছিক সেশন মেটাডেটা (শিরোনাম, নোট)

একটি ExerciseSessionRecord এর ডেটার অংশ হিসেবে এক্সারসাইজ রুট, ল্যাপ এবং সেগমেন্টও থাকতে পারে। এছাড়াও, একটি সেশন চলাকালীন HeartRateRecord বা SpeedRecord মতো অন্যান্য ডেটা টাইপ রেকর্ড করা এবং এর সাথে যুক্ত করা যেতে পারে।

সংশ্লিষ্ট ডেটা প্রকার

ওয়ার্কআউট সেশন সম্পর্কিত ডেটা স্বতন্ত্র রেকর্ড টাইপ দ্বারা উপস্থাপিত হয়। সাধারণ টাইপগুলোর মধ্যে রয়েছে:

  • HeartRateRecord : এটি হৃদস্পন্দনের ধারাবাহিক পরিমাপসমূহকে উপস্থাপন করে।
  • SpeedRecord : একাধিক গতি পরিমাপের একটি তালিকা উপস্থাপন করে।
  • DistanceRecord : দুটি পাঠের মধ্যবর্তী অতিক্রান্ত দূরত্ব নির্দেশ করে।
  • TotalCaloriesBurnedRecord : দুটি রিডিংয়ের মধ্যবর্তী সময়ে মোট কত ক্যালোরি খরচ হয়েছে তা নির্দেশ করে।
  • ElevationGainedRecord : দুটি পাঠের মধ্যবর্তী সময়ে অর্জিত উচ্চতা নির্দেশ করে।
  • StepsCadenceRecord : দুটি পাঠের মধ্যবর্তী পদক্ষেপের ব্যবধান উপস্থাপন করে।
  • PowerRecord : দুটি রিডিংয়ের মধ্যবর্তী সময়ে শক্তি উৎপাদনের পরিমাণ নির্দেশ করে, যা সাইক্লিংয়ের মতো কার্যকলাপে সাধারণত দেখা যায়।

ডেটা টাইপগুলির সম্পূর্ণ তালিকার জন্য, হেলথ কানেক্ট ডেটা টাইপস দেখুন।

ব্যায়ামের পথ

আপনি ExerciseRoute ব্যবহার করে আউটডোর ওয়ার্কআউটের সাথে একটি রুট যুক্ত করতে পারেন। রুটগুলি ক্রমানুসারে ExerciseRoute.Location অবজেক্ট নিয়ে গঠিত, যার প্রতিটিতে থাকে:

  • অক্ষাংশ এবং দ্রাঘিমাংশ
  • ঐচ্ছিক উচ্চতা
  • ঐচ্ছিক বিয়ারিং
  • নির্ভুলতার তথ্য
  • টাইমস্ট্যাম্প

সেশন রুট লিঙ্ক করুন

একটি ExerciseRoute একটি এক্সারসাইজ সেশনের ক্রমিক অবস্থানের ডেটা থাকে। Health Connect-এ এটিকে একটি স্বাধীন রেকর্ড হিসেবে গণ্য করা হয় না। এর পরিবর্তে, একটি ExerciseSessionRecord সন্নিবেশ বা আপডেট করার সময় আপনাকে ExerciseRoute ডেটা সরবরাহ করতে হয়।

উন্নয়ন বিবেচনা

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

পটভূমি সম্পাদন

ওয়ার্কআউট অ্যাপগুলো সাধারণত স্ক্রিন বন্ধ থাকা অবস্থায় চলে। এই অবস্থায়, আপনার ব্যবহার করা উচিত:

  • অবস্থান এবং সেন্সর স্যাম্পলিংয়ের জন্য ফোরগ্রাউন্ড পরিষেবা
  • বিলম্বিত লেখা বা সিঙ্কিংয়ের জন্য WorkManager
  • নিয়মিত রেকর্ড লেখার জন্য ব্যাচিং কৌশল

সমস্ত রাইটের ক্ষেত্রে সেশন আইডি একই রেখে ধারাবাহিকতা বজায় রাখুন।

অনুমতি

ওয়ার্কআউটের ডেটা পড়া বা লেখার আগে আপনার অ্যাপকে অবশ্যই প্রাসঙ্গিক হেলথ কানেক্ট পারমিশনগুলোর জন্য অনুরোধ করতে হবে। ওয়ার্কআউটের জন্য সাধারণ পারমিশনগুলোর মধ্যে রয়েছে এক্সারসাইজ সেশন, এক্সারসাইজ রুট এবং হার্ট রেট বা স্পিডের মতো মেট্রিক। এর মধ্যে নিম্নলিখিত বিষয়গুলো অন্তর্ভুক্ত:

  • ব্যায়াম সেশন: ExerciseSessionRecord এর জন্য পঠন ও লিখন অনুমতি।
  • ব্যায়ামের রুট: ExerciseRoute জন্য পঠন ও লিখন অনুমতি।
  • হৃদস্পন্দন: HeartRateRecord এর জন্য পঠন ও লিখন অনুমতি।
  • স্পিড: SpeedRecord জন্য পঠন ও লিখন অনুমতি।
  • Distance: DistanceRecord এর জন্য পঠন ও লিখন অনুমতি।
  • ক্যালোরি: TotalCaloriesBurnedRecord এর জন্য পঠন ও লিখন অনুমতি।
  • অর্জিত উচ্চতা: ElevationGainedRecord জন্য পঠন ও লিখন অনুমতি।
  • Steps Cadence: StepsCadenceRecord এর জন্য পঠন ও লিখন অনুমতি।
  • পাওয়ার: PowerRecord জন্য পঠন ও লিখন অনুমতি।
  • ধাপসমূহ: StepsRecord এর জন্য পঠন ও লিখন অনুমতি।

নিম্নলিখিতে একটি ওয়ার্কআউট সেশনের জন্য একাধিক অনুমতির অনুরোধ করার একটি উদাহরণ দেখানো হয়েছে, যেখানে রুট, হার্ট রেট, দূরত্ব, ক্যালোরি, গতি এবং স্টেপস ডেটা অন্তর্ভুক্ত রয়েছে:

একটি ক্লায়েন্ট ইনস্ট্যান্স তৈরি করার পর, আপনার অ্যাপকে ব্যবহারকারীর কাছ থেকে অনুমতির জন্য অনুরোধ করতে হবে। ব্যবহারকারীদের যেকোনো সময় অনুমতি প্রদান বা প্রত্যাখ্যান করার ক্ষমতা থাকতে হবে।

এটি করার জন্য, প্রয়োজনীয় ডেটা টাইপগুলোর জন্য এক সেট পারমিশন তৈরি করুন। প্রথমে নিশ্চিত করুন যে, সেটের অন্তর্ভুক্ত পারমিশনগুলো আপনার অ্যান্ড্রয়েড ম্যানিফেস্টে ঘোষিত হয়েছে।

// Create a set of permissions for required data types
val PERMISSIONS =
    setOf(
  HealthPermission.getReadPermission(ExerciseSessionRecord::class),
  HealthPermission.getWritePermission(ExerciseSessionRecord::class),
  HealthPermission.getReadPermission(ExerciseRoute::class),
  HealthPermission.getWritePermission(ExerciseRoute::class),
  HealthPermission.getReadPermission(HeartRateRecord::class),
  HealthPermission.getWritePermission(HeartRateRecord::class),
  HealthPermission.getReadPermission(SpeedRecord::class),
  HealthPermission.getWritePermission(SpeedRecord::class),
  HealthPermission.getReadPermission(DistanceRecord::class),
  HealthPermission.getWritePermission(DistanceRecord::class),
  HealthPermission.getReadPermission(TotalCaloriesBurnedRecord::class),
  HealthPermission.getWritePermission(TotalCaloriesBurnedRecord::class),
  HealthPermission.getReadPermission(StepsRecord::class),
  HealthPermission.getWritePermission(StepsRecord::class)
)

আপনার অ্যাপে প্রয়োজনীয় অনুমতিগুলো আগে থেকেই দেওয়া আছে কিনা তা দেখতে getGrantedPermissions ব্যবহার করুন। যদি না থাকে, তাহলে সেই অনুমতিগুলোর জন্য অনুরোধ করতে createRequestPermissionResultContract ব্যবহার করুন। এটি হেলথ কানেক্ট পারমিশন স্ক্রিনটি প্রদর্শন করবে।

// Create the permissions launcher
val requestPermissionActivityContract = PermissionController.createRequestPermissionResultContract()

val requestPermissions = registerForActivityResult(requestPermissionActivityContract) { granted ->
  if (granted.containsAll(PERMISSIONS)) {
    // Permissions successfully granted
  } else {
    // Lack of required permissions
  }
}

suspend fun checkPermissionsAndRun(healthConnectClient: HealthConnectClient) {
  val granted = healthConnectClient.permissionController.getGrantedPermissions()
  if (granted.containsAll(PERMISSIONS)) {
    // Permissions already granted; proceed with inserting or reading data
  } else {
    requestPermissions.launch(PERMISSIONS)
  }
}

যেহেতু ব্যবহারকারীরা যেকোনো সময় অনুমতি দিতে বা প্রত্যাহার করতে পারেন, তাই আপনার অ্যাপকে প্রতিবার ব্যবহারের আগে অনুমতি যাচাই করতে হবে এবং অনুমতি হারিয়ে গেলে তার মোকাবিলা করতে হবে।

অনুমতি অনুরোধ করতে, checkPermissionsAndRun ফাংশনটি কল করুন:

if (!granted.containsAll(PERMISSIONS)) {
    requestPermissions.launch(PERMISSIONS)
    // Check if required permissions are not granted, and return
  }
// Permissions already granted; proceed with inserting or reading data

যদি আপনার শুধুমাত্র একটি ডেটা টাইপের জন্য, যেমন হার্ট রেট, অনুমতির অনুরোধ করার প্রয়োজন হয়, তাহলে আপনার অনুমতি সেটে কেবল সেই ডেটা টাইপটিই অন্তর্ভুক্ত করুন:

হৃদস্পন্দনের তথ্য অ্যাক্সেস নিম্নলিখিত অনুমতি দ্বারা সুরক্ষিত:

  • android.permission.health.READ_HEART_RATE
  • android.permission.health.WRITE_HEART_RATE

আপনার অ্যাপে হার্ট রেট দেখার সুবিধা যোগ করতে, প্রথমে HeartRateRecord ডেটা টাইপের জন্য অনুমতি চেয়ে নিন।

হৃদস্পন্দন লিখতে পারার জন্য আপনাকে যে অনুমতিটি ঘোষণা করতে হবে তা এখানে দেওয়া হলো:

<application>
  <uses-permission
android:name="android.permission.health.WRITE_HEART_RATE" />
...
</application>

হৃদস্পন্দন পড়ার জন্য, আপনাকে নিম্নলিখিত অনুমতিগুলির জন্য অনুরোধ করতে হবে:

<application>
  <uses-permission
android:name="android.permission.health.READ_HEART_RATE" />
...
</application>

একটি ওয়ার্কআউট সেশন বাস্তবায়ন করুন

এই বিভাগে ওয়ার্কআউটের ডেটা রেকর্ড করার জন্য প্রস্তাবিত কার্যপ্রবাহ বর্ণনা করা হয়েছে।

সেশন শুরু করুন

একটি নতুন ওয়ার্কআউট তৈরি করতে:

  1. একটি অনন্য সেশন আইডি তৈরি করুন: এই আইডিটি স্থিতিশীল কিনা তা যাচাই করুন। যদি আপনার অ্যাপ প্রসেসটি বন্ধ করে আবার চালু করা হয়, তবে সেশন খণ্ডিত হওয়া রোধ করতে আপনাকে অবশ্যই একই আইডি ব্যবহার করে পুনরায় কাজ শুরু করতে সক্ষম হতে হবে।
  2. সিঙ্ক পুনরায় চেষ্টার সময় ডুপ্লিকেট প্রতিরোধ করতে একটি metadata.clientRecordId সেট করুন।
  3. একটি ExerciseSessionRecord লিখুন: এতে শুরুর সময় অন্তর্ভুক্ত করুন।
  4. ডেটা টাইপ এবং জিপিএস ডেটা সংগ্রহ শুরু করুন: সেশন রেকর্ড সফলভাবে শুরু হওয়ার পরেই কেবল এগুলো শুরু করুন।

উদাহরণ:

val sessionId = UUID.randomUUID().toString()
val sessionClientId = UUID.randomUUID().toString()

val session = ExerciseSessionRecord(
    id = sessionId,
    exerciseType = ExerciseType.EXERCISE_TYPE_RUNNING,
    startTime = Instant.now(),
    endTime = null,
    metadata = Metadata(clientRecordId = sessionClientId),
)

healthConnectClient.insertRecords(listOf(session))

ব্যায়ামের পথ রেকর্ড করুন

পঠন নির্দেশিকা সম্পর্কে আরও জানতে 'কাঁচা ডেটা পড়ুন' দেখুন।

ব্যায়ামের রুট রেকর্ড করার সময়, আপনার ডেটা ব্যাচ করা উচিত। এর মানে হলো, প্রতিটি জিপিএস পয়েন্ট ঘটার সাথে সাথে আলাদাভাবে সংরক্ষণ না করে, আপনি একগুচ্ছ পয়েন্ট সংগ্রহ করবেন এবং একটিমাত্র কলে সেগুলোকে একসাথে সংরক্ষণ করবেন।

এটি গুরুত্বপূর্ণ, কারণ প্রতিবার আপনার অ্যাপ যখন হেলথ কানেক্ট-এ ডেটা পড়ে বা লেখে, তখন সামান্য পরিমাণ ব্যাটারি এবং প্রসেসিং পাওয়ার খরচ হয়।

নিম্নলিখিত কোডটি দেখায় কিভাবে ব্যাচে রেকর্ড করতে হয়:

// 1. Create a list to hold your route locations
val routeLocations = mutableListOf<ExerciseRoute.Location>()

// 2. Add points to your list as the exercise happens
routeLocations.add(
    ExerciseRoute.Location(
        time = Instant.now(),
        latitude = 37.7749,
        longitude = -122.4194
    )
)

// ... keep adding points over a period of time ...

// 3. Save the whole list at once (Batching)
val session = ExerciseSessionRecord(
    startTime = startTime,
    endTime = endTime,
    exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_RUNNING,
    // We pass the whole list here
    exerciseRoute = ExerciseRoute(routeLocations)
)

healthConnectClient.insertRecords(listOf(session))

একটি সেশন শেষ করুন

তথ্য সংগ্রহ বন্ধ করার পর:

  • রেকর্ডটি আপডেট করুন: আপনার অ্যাপ ExerciseSessionRecord একটি endTime দিয়ে আপডেট করে।
  • ডেটা চূড়ান্ত করুন: ঐচ্ছিকভাবে সারসংক্ষেপ মান (যেমন মোট দূরত্ব বা গড় গতি) গণনা করুন এবং সেগুলোকে অতিরিক্ত রেকর্ড হিসেবে লিখুন।
val finishedSession = session.copy(endTime = Instant.now())
healthConnectClient.updateRecords(listOf(finishedSession))

ওয়ার্কআউটের ডেটা পড়া

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

যদি আপনার ওয়ার্কআউট ডেটা কোনো ব্যাকএন্ড সার্ভারের সাথে সিঙ্ক করার প্রয়োজন হয়, অথবা হেলথ কানেক্ট ব্যবহার করে আপনার অ্যাপের ডেটাস্টোর আপ-টু-ডেট রাখতে চান, তাহলে চেঞ্জলগস (ChangeLogs) ব্যবহার করুন। এর মাধ্যমে আপনি একটি নির্দিষ্ট সময় থেকে যোগ করা, আপডেট করা বা মুছে ফেলা রেকর্ডগুলোর একটি তালিকা পেতে পারেন, যা ম্যানুয়ালি পরিবর্তনগুলো ট্র্যাক করা বা বারবার সমস্ত ডেটা পড়ার চেয়ে বেশি কার্যকর। আরও তথ্যের জন্য, ‘হেলথ কানেক্টের সাথে ডেটা সিঙ্ক করুন’ (Sync data with Health Connect ) দেখুন।

সেশনগুলো পড়ুন

এক্সারসাইজ সেশনগুলো পড়ার জন্য, টাইপ হিসেবে ExerciseSessionRecord সহ একটি ReadRecordsRequest ব্যবহার করুন। সাধারণত একটি নির্দিষ্ট সময়সীমা দিয়ে এটি ফিল্টার করা হয়।

suspend fun readExerciseSessions(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant
) {
    val response = healthConnectClient.readRecords(
        ReadRecordsRequest(
            recordType = ExerciseSessionRecord::class,
            timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
        )
    )

    for (exerciseRecord in response.records) {
        // Process each session
        val exerciseType = exerciseRecord.exerciseType
        val notes = exerciseRecord.notes
    }
}

রুট পড়ুন

যদিও ExerciseRoute ডেটা একটি এক্সারসাইজ সেশনের অংশ হিসেবে লেখা হয়, এটি আলাদাভাবে পড়তে হবে। এর রাউট ডেটা পড়ার জন্য সেশনের ID সহ getExerciseRoute() মেথডটি ব্যবহার করুন:

suspend fun readExerciseRoute(
    healthConnectClient: HealthConnectClient,
    exerciseSessionRecord: ExerciseSessionRecord
) {
    // Check if the session has a route
    val route = healthConnectClient.getExerciseRoute(
        exerciseSessionRecordId = exerciseSessionRecord.metadata.id
    )

    when (route) {
        is ExerciseRouteResponse.Success -> {
            val locations = route.exerciseRoute.locations
            for (location in locations) {
                // Use latitude, longitude, and altitude
            }
        }
        is ExerciseRouteResponse.NoData -> {
            // Handle case where no route exists
        }
        is ExerciseRouteResponse.ConsentRequired -> {
            // Handle case where permissions are missing
        }
    }
}

ডেটা টাইপ পড়ুন

কোনো সেশন চলাকালীন নির্দিষ্ট সূক্ষ্ম ডেটা (যেমন হৃদস্পন্দন) পড়ার জন্য, সেশনের startTime এবং endTime ব্যবহার করে সেই ডেটা টাইপের জন্য অনুরোধটি ফিল্টার করুন।

suspend fun readHeartRateData(
    healthConnectClient: HealthConnectClient,
    exerciseSession: ExerciseSessionRecord
) {
    val response = healthConnectClient.readRecords(
        ReadRecordsRequest(
            recordType = HeartRateRecord::class,
            timeRangeFilter = TimeRangeFilter.between(
                exerciseSession.startTime,
                exerciseSession.endTime
            )
        )
    )

    for (heartRateRecord in response.records) {
        for (sample in heartRateRecord.samples) {
            val bpm = sample.beatsPerMinute
        }
    }
}

সর্বোত্তম অনুশীলন

ডেটার নির্ভরযোগ্যতা ও ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে এই নির্দেশিকাগুলো অনুসরণ করুন:

  • সক্রিয় ট্র্যাকিং চলাকালীন ঘন ঘন লিখুন : সক্রিয় ট্র্যাকিংয়ের জন্য, ডেটা উপলব্ধ হওয়ার সাথে সাথেই অথবা সর্বোচ্চ ১৫ মিনিটের ব্যবধানে লিখুন।
  • ব্যাকগ্রাউন্ড সিঙ্কের জন্য WorkManager ব্যবহার করুন । ডিফার্ড রাইটের জন্যও WorkManager ব্যবহার করুন। রিয়েল-টাইম ডেটা এবং ব্যাটারির কার্যকারিতার মধ্যে ভারসাম্য বজায় রাখতে ১৫ মিনিটের ব্যবধান রাখার লক্ষ্য রাখুন।
  • ব্যাচ রাইট রিকোয়েস্ট : প্রতিটি সেন্সর ইভেন্ট আলাদাভাবে লিখবেন না। আপনার রিকোয়েস্টগুলোকে কয়েকটি ভাগে ভাগ করুন। হেলথ কানেক্ট প্রতি রাইট রিকোয়েস্টে ১০০০টি পর্যন্ত রেকর্ড পরিচালনা করতে পারে।
  • সেশন আইডি স্থিতিশীল এবং অনন্য রাখুন : আপনার সেশনগুলির জন্য সামঞ্জস্যপূর্ণ শনাক্তকারী ব্যবহার করুন। যদি কোনো সেশন সম্পাদনা বা আপডেট করা হয়, তবে একই আইডি ব্যবহার করলে সেটিকে একটি নতুন, পৃথক সেশন হিসাবে গণ্য করা হয় না।
  • ডেটা টাইপ এবং রাউট পয়েন্ট উভয়ের জন্যই ব্যাচিং ব্যবহার করুন : ইনপুট/আউটপুট ওভারহেড কমাতে এবং ব্যাটারির আয়ু বাঁচাতে, প্রতিটি ডেটা পয়েন্ট আলাদাভাবে লেখার পরিবর্তে সেগুলোকে একটিমাত্র insertRecords কলে একত্রিত করুন।
  • ডুপ্লিকেট ডেটা লেখা এড়িয়ে চলুন: ক্লায়েন্ট আইডি ব্যবহার করুন : রেকর্ড তৈরি করার সময়, একটি metadata.clientRecordId সেট করুন। হেলথ কানেক্ট অনন্য রেকর্ড শনাক্ত করতে এটি ব্যবহার করে। আপনি যদি এমন একটি clientRecordId দিয়ে রেকর্ড লেখার চেষ্টা করেন যা ইতিমধ্যেই বিদ্যমান, তাহলে হেলথ কানেক্ট ডুপ্লিকেটটি উপেক্ষা করবে অথবা নতুন রেকর্ড তৈরি না করে বিদ্যমান রেকর্ডটি আপডেট করবে। সিঙ্ক পুনরায় চেষ্টা করার সময় বা অ্যাপ পুনরায় ইনস্টল করার সময় ডুপ্লিকেট প্রতিরোধ করার সবচেয়ে কার্যকর উপায় হলো metadata.clientRecordId সেট করা।
    val record = StepsRecord(
        count = 100,
        startTime = startTime,
        endTime = endTime,
        startZoneOffset = ZoneOffset.UTC,
        endZoneOffset = ZoneOffset.UTC,
        metadata = Metadata(
            // Use a unique ID from your own database
            clientRecordId = "daily_steps_2023_10_27_user_123"
        )
    )
  • বিদ্যমান ডেটা যাচাই করুন : সিঙ্ক করার আগে, আপনার অ্যাপের রেকর্ড আগে থেকেই আছে কিনা তা দেখতে সময়সীমাটি কোয়েরি করুন।
  • GPS নির্ভুলতা যাচাই করুন : ExerciseRoute এ লেখার আগে কম নির্ভুলতার GPS স্যাম্পলগুলো (যেমন, উচ্চ আনুভূমিক নির্ভুলতা ব্যাসার্ধযুক্ত পয়েন্ট) ফিল্টার করে বাদ দিন, যাতে ম্যাপটি পরিচ্ছন্ন ও পেশাদার দেখায়।
  • টাইমস্ট্যাম্প যেন ওভারল্যাপ না করে তা নিশ্চিত করুন : যাচাই করুন যে আগের সেশনটি শেষ হওয়ার আগে নতুন কোনো সেশন শুরু হচ্ছে না। ওভারল্যাপিং সেশন ফিটনেস ড্যাশবোর্ড এবং সারসংক্ষেপ গণনায় দ্বন্দ্ব সৃষ্টি করতে পারে।
  • অনুমতির জন্য সুস্পষ্ট কারণ দর্শান : আপনার অ্যাপের কেন স্বাস্থ্য ডেটাতে অ্যাক্সেস প্রয়োজন, তা ব্যাখ্যা করতে Permission.createIntent ফ্লো ব্যবহার করুন, উদাহরণস্বরূপ: 'আপনার রক্তচাপের প্রবণতা পর্যবেক্ষণ করতে এবং অন্তর্দৃষ্টি প্রদান করতে।'
  • বিরতি এবং পুনরায় শুরু করার সুবিধা : আপনার অ্যাপ বিরতি সঠিকভাবে পরিচালনা করে কিনা তা যাচাই করুন। যখন কোনো ব্যবহারকারী বিরতি নেন, তখন রুট পয়েন্ট এবং ডেটা টাইপ সংগ্রহ করা বন্ধ করুন, যাতে গড় গতি এবং সময়কাল সঠিক থাকে।
  • দীর্ঘ সময় ধরে চলা সেশন পরীক্ষা করুন : কয়েক ঘন্টা ধরে চলা সেশন চলাকালীন ব্যাটারির ব্যবহার পর্যবেক্ষণ করে যাচাই করুন যে আপনার ব্যাচিং ইন্টারভাল এবং সেন্সরের ব্যবহার ডিভাইসটির চার্জ দ্রুত শেষ করে দিচ্ছে না।
  • সেন্সর রেটের সাথে টাইমস্ট্যাম্প মেলান : ডেটার উচ্চ নির্ভুলতা বজায় রাখতে আপনার রেকর্ডের টাইমস্ট্যাম্পগুলোকে সেন্সরের প্রকৃত ফ্রিকোয়েন্সির সাথে মেলান।

পরীক্ষা

ডেটার সঠিকতা এবং উন্নত মানের ব্যবহারকারীর অভিজ্ঞতা যাচাই করার জন্য, এই টেস্টিং কৌশলগুলো অনুসরণ করুন এবং অফিসিয়াল ‘টেস্ট টপ ইউজ কেসেস’ ডকুমেন্টেশনটি দেখুন।

যাচাইকরণ সরঞ্জাম

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

গুণমান চেকলিস্ট

সাধারণ স্থাপত্য

একটি ওয়ার্কআউট বাস্তবায়নে সাধারণত অন্তর্ভুক্ত থাকে:

উপাদান পরিচালনা করে
সেশন নিয়ন্ত্রক সেশন অবস্থা
টাইমার
ব্যাচিং লজিক
ডেটা টাইপ কন্ট্রোলার
অবস্থান নমুনা
রিপোজিটরি লেয়ার (হেলথ কানেক্ট অপারেশনগুলোকে আবৃত করে:) সেশন ঢোকান
ডেটা টাইপ সন্নিবেশ করুন
রুট পয়েন্টগুলি সন্নিবেশ করে
সেশনের সারাংশ পড়ুন
UI স্তর (প্রদর্শন): সময়কাল
লাইভ ডেটা প্রকার
মানচিত্রের পূর্বরূপ
বিভক্ত গণনা
লাইভ জিপিএস ট্রেস

সমস্যা সমাধান

লক্ষণ সম্ভাব্য কারণ সমাধান
সেশনের সাথে রুট সংযুক্ত নয় সেশন আইডি বা সময়সীমার অমিল। নিশ্চিত করুন যে ExerciseRoute এমন একটি সময়সীমা দিয়ে লেখা হয়েছে যা ExerciseSessionRecord সময়কালের সম্পূর্ণ ভেতরে পড়ে। পরবর্তীতে সেশনটি উল্লেখ করার ক্ষেত্রে আপনি সামঞ্জস্যপূর্ণ আইডি ব্যবহার করছেন কিনা তা যাচাই করুন। ‘Recording exercise routes’ দেখুন।
অনুপস্থিত ডেটা টাইপ (উদাহরণস্বরূপ, হার্ট রেট) লেখার অনুমতি নেই অথবা সময় ফিল্টার ভুল। যাচাই করুন যে আপনি নির্দিষ্ট ডেটা টাইপের অনুমতি চেয়েছেন এবং ব্যবহারকারী তা মঞ্জুর করেছেন। যাচাই করুন যে আপনার ReadRecordsRequest ব্যবহৃত TimeRangeFilter সেশনের সাথে মেলে। অনুমতিসমূহ দেখুন।
সেশন লিখতে ব্যর্থ হয় ওভারল্যাপিং টাইমস্ট্যাম্প। হেলথ কানেক্ট একই অ্যাপের বিদ্যমান ডেটার সাথে ওভারল্যাপ হওয়া রেকর্ড প্রত্যাখ্যান করতে পারে। যাচাই করুন যে নতুন সেশনের startTime আগেরটির endTime পরে।
কোন জিপিএস ডেটা রেকর্ড করা হয়নি ফোরগ্রাউন্ড পরিষেবাটি বন্ধ বা নিষ্ক্রিয় করা হয়েছে। স্ক্রিন বন্ধ থাকা অবস্থায় ডেটা সংগ্রহ করতে হলে, আপনাকে অবশ্যই foregroundServiceType="health" অথবা location অ্যাট্রিবিউটসহ একটি ফোরগ্রাউন্ড সার্ভিস ব্যবহার করতে হবে।
সদৃশ রেকর্ড দেখা যায় clientRecordId অনুপস্থিত। প্রতিটি রেকর্ডের Metadata একটি অনন্য clientRecordId নির্ধারণ করুন। এর ফলে, সিঙ্ক পুনরায় চেষ্টার সময় একই ডেটা দুইবার লেখা হলে Health Connect ডুপ্লিকেট ডেটা বাদ দিতে পারে। সর্বোত্তম অনুশীলন দেখুন।

সাধারণ ডিবাগিং পদক্ষেপ

অনুমতির অবস্থা যাচাই করুন। রিড বা রাইট অপারেশন করার আগে সর্বদা getPermissionStatus() কল করুন। ব্যবহারকারীরা যেকোনো সময় সিস্টেম সেটিংস থেকে অনুমতি প্রত্যাহার করতে পারেন।
এক্সিকিউশন মোড যাচাই করুন। যদি আপনার অ্যাপ ব্যাকগ্রাউন্ডে ডেটা সংগ্রহ না করে, তাহলে যাচাই করুন যে আপনি আপনার AndroidManifest.xml ফাইলে সঠিক অনুমতিগুলো ঘোষণা করেছেন এবং ব্যবহারকারী অ্যাপটিকে "ব্যাটারি রেস্ট্রিকটেড" মোডে রাখেননি।