Health Connect-এর মাধ্যমে ওয়ার্কআউট অভিজ্ঞতা ডেভেলপ করা

আপনার অ্যাপে ওয়ার্ক-আউট অভিজ্ঞতা তৈরি করতে চাইলে, আপনি Health Connect ব্যবহার করে এগুলি করতে পারবেন:

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

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

এক ঝলকে: একটি বিস্তারিত ওয়ার্ক-আউট ট্র্যাকার তৈরি করা

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

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

এই ওয়ার্কফ্লো অন্যান্য Health Connect অ্যাপের সাথে ইন্টারঅপারেবিলিটি চালু করে এবং ব্যবহারকারী-নিয়ন্ত্রিত ডেটা অ্যাক্সেস যাচাই করে।

শুরু করার আগে

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

মূল ধারণা

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

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

ExerciseSessionRecord হল ওয়ার্কআউট ডেটার সেন্ট্রাল রেকর্ড, যা একটি সিঙ্গেল ওয়ার্কআউট সেশনকে উপস্থাপন করে। প্রতিটি রেকর্ড স্টোর:

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

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

সম্পর্কিত ডেটার ধরন

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

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

ডেটার ধরনের সম্পূর্ণ তালিকা দেখতে, Health Connect ডেটার ধরন দেখুন।

ব্যায়ামের রুট

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

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

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

ExerciseRoute-এ কোনও এক্সারসাইজ সেশনের ক্রমিক লোকেশন ডেটা থাকে। Health Connect-এ এটিকে স্বতন্ত্র রেকর্ড হিসেবে বিবেচনা করা হয় না। পরিবর্তে, আপনি কোনও ExerciseSessionRecord ইনসার্ট বা আপডেট করার সময় ExerciseRoute ডেটা প্রদান করেন।

ডেভেলপমেন্ট সংক্রান্ত বিবেচ্য বিষয়

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

ব্যাকগ্রাউন্ড এক্সিকিউশন

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

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

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

অনুমতি

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

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

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

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

val permissions =
    setOf(
        HealthPermission.getReadPermission(ExerciseSessionRecord::class),
        HealthPermission.getWritePermission(ExerciseSessionRecord::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 ব্যবহার করুন। এটি Health Connect-এর অনুমতি সংক্রান্ত স্ক্রিন দেখায়।
val permissions = setOf(
        HealthPermission.getReadPermission(StepsRecord::class),
        HealthPermission.getWritePermission(StepsRecord::class),
        HealthPermission.getReadPermission(HeartRateRecord::class),
        HealthPermission.getWritePermission(HeartRateRecord::class)
    )

val requestPermissionsLauncher = rememberLauncherForActivityResult(
    contract = PermissionController.createRequestPermissionResultContract()
) { grantedPermissions ->
    if (grantedPermissions.containsAll(permissions)) {
        coroutineScope.launch { snackbarHostState.showSnackbar("Permissions granted!") }
    } else {
        coroutineScope.launch { snackbarHostState.showSnackbar("Permissions denied.") }
    }
}
যেহেতু ব্যবহারকারীরা যেকোনও সময় অনুমতি দিতে বা প্রত্যাহার করতে পারেন, তাই আপনার অ্যাপকে প্রতিবার অনুমতি ব্যবহার করার আগে তা চেক করতে হবে এবং অনুমতি প্রত্যাহার করা হলে সেই পরিস্থিতি সামলাতে হবে।

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

if (!granted.containsAll(permissions)) {
    // Check if required permissions are not granted, and return
    return emptySet()
}
// 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 sessionClientId = UUID.randomUUID().toString()
val zoneOffset = ZoneOffset.systemDefault().rules.getOffset(startTime)

val session =   ExerciseSessionRecord(
    startTime = startTime,
    startZoneOffset = zoneOffset,
    endTime = startTime.plusSeconds(3600),
    endZoneOffset = zoneOffset,
    exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_RUNNING,
    metadata = Metadata.activelyRecorded(clientRecordId = sessionClientId, device = Device(type = Device.TYPE_PHONE)),
)

healthConnectClient.insertRecords(listOf(session))

ব্যায়ামের রুট রেকর্ড করা

রিডিং গাইডেন্স সম্পর্কে আরও জানতে কাঁচা ডেটা পড়ুন।

এক্সারসাইজ রুট রেকর্ড করার সময়, আপনাকে ডেটা ব্যাচ করতে হবে। এর অর্থ হল, প্রতিটি GPS পয়েন্ট সেভ না করে, আপনি পয়েন্টের একটি গ্রুপ সংগ্রহ করেন এবং একটি কলে সেগুলি একসাথে সেভ করেন।

এটি গুরুত্বপূর্ণ কারণ আপনার অ্যাপ যতবার Health Connect থেকে ডেটা রিড বা রাইট করবে, ততবার এটি ব্যাটারি ও প্রসেসিং পাওয়ারের সামান্য অংশ ব্যবহার করবে।

ব্যাচে কীভাবে রেকর্ড করতে হয় তা নিম্নলিখিত কোড থেকে জানতে পারবেন:

// 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 সম্পর্কে কোয়েরি করতে পারেন।

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

সেশন সংক্রান্ত ডেটা পড়া

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

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 ডেটা এক্সারসাইজ সেশনের অংশ হিসেবে লেখা হয়, তবে সেটি আলাদাভাবে পড়তে হবে। এর রুট ডেটা পড়তে সেশনের আইডি সহ 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 ব্যবহার করুন। রিয়েল-টাইম ডেটা এবং ব্যাটারি দক্ষতার মধ্যে ভারসাম্য বজায় রাখতে ১৫-মিনিটের ব্যবধানে ডেটা সংগ্রহ করার চেষ্টা করুন।
  • ব্যাচ রাইট রিকোয়েস্ট: প্রতিটি সেন্সর ইভেন্ট আলাদা আলাদা করে লিখবেন না। আপনার অনুরোধকে ছোট ছোট ভাগে ভাগ করুন। প্রতিটি লেখার অনুরোধে Health Connect সর্বাধিক ১০০০টি রেকর্ড ম্যানেজ করে।
  • সেশন আইডি স্থিতিশীল ও অনন্য রাখুন: আপনার সেশনের জন্য সামঞ্জস্যপূর্ণ শনাক্তকারী ব্যবহার করুন। কোনও সেশন এডিট বা আপডেট করা হলে, একই আইডি ব্যবহার করলে সেটি নতুন, আলাদা সেশন হিসেবে গণ্য করা হয় না।
  • দুটি ডেটার ধরন ও রুট পয়েন্টের জন্য ব্যাচিং ব্যবহার করুন: ইনপুট/আউটপুট ওভারহেড কমাতে এবং ব্যাটারির আয়ু বজায় রাখতে, প্রতিটি পয়েন্ট আলাদা আলাদা করে লেখার পরিবর্তে আপনার ডেটা পয়েন্টগুলিকে একটি insertRecords কলে গ্রুপ করুন।
  • ডুপ্লিকেট ডেটা লেখা এড়িয়ে চলুন: ক্লায়েন্ট আইডি ব্যবহার করুন: রেকর্ড তৈরি করার সময়, metadata.clientRecordId সেট করুন। অনন্য রেকর্ড শনাক্ত করতে Health Connect এটি ব্যবহার করে। আপনি যদি আগে থেকেই আছে এমন clientRecordId সহ কোনও রেকর্ড লেখার চেষ্টা করেন, তাহলে Health Connect ডুপ্লিকেটটি উপেক্ষা করবে বা নতুন রেকর্ড তৈরি করার পরিবর্তে বিদ্যমান রেকর্ডটি আপডেট করবে। সিঙ্ক করার প্রচেষ্টা আবার করার সময় বা অ্যাপ আবার ইনস্টল করার সময় ডুপ্লিকেট এড়ানোর সবচেয়ে কার্যকর উপায় হল 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"
        )
    )
  • আগে থেকে থাকা ডেটা চেক করুন: সিঙ্ক করার আগে, আপনার অ্যাপের রেকর্ড আগে থেকেই আছে কিনা তা দেখতে, সময়সীমা কোয়েরি করুন।
  • জিপিএস অ্যাকুরেসি যাচাই করা: ExerciseRoute-এ লেখার আগে কম অ্যাকুরেসিযুক্ত জিপিএস স্যাম্পেল (যেমন, বেশি হরাইজন্টাল অ্যাকুরেসি রেডিয়াস সহ পয়েন্ট) ফিল্টার করে নিন, যাতে ম্যাপটি পরিষ্কার ও পেশাদার দেখায়।
  • টাইমস্ট্যাম্প যেন ওভারল্যাপ না করে তা নিশ্চিত করুন: নতুন সেশন যেন আগের সেশন শেষ হওয়ার আগে শুরু না হয় তা ভালো করে দেখে নিন। ওভারল্যাপ করা সেশন ফিটনেস ড্যাশবোর্ড ও সারসংক্ষেপ গণনার ক্ষেত্রে সমস্যা সৃষ্টি করতে পারে।
  • অনুমতির জন্য স্পষ্ট যুক্তি দিন: আপনার অ্যাপের কেন স্বাস্থ্য ডেটা অ্যাক্সেস করা প্রয়োজন তা ব্যাখ্যা করতে Permission.createIntent ফ্লো ব্যবহার করুন, যেমন: 'আপনার রক্তচাপের ট্রেন্ড মনিটর করতে এবং ইনসাইট প্রদান করতে।'
  • পজ ও আবার চালু করার সুবিধা: আপনার অ্যাপ সঠিকভাবে পজ করা যায় কিনা তা যাচাই করুন। কোনও ব্যবহারকারী পজ করলে, রুট পয়েন্ট ও ডেটার ধরন সংগ্রহ করা বন্ধ করে দিন যাতে গড় গতি ও সময়সীমা সঠিক থাকে।
  • দীর্ঘক্ষণ ধরে চলা সেশন পরীক্ষা করুন: আপনার ব্যাচিং ইন্টারভ্যাল ও সেন্সর ব্যবহার ডিভাইসকে ড্রেন করে দেয় কিনা তা যাচাই করতে, কয়েক ঘণ্টা ধরে চলা সেশনের সময় ব্যাটারি কতটা খরচ হচ্ছে তা মনিটর করুন।
  • সেন্সর রেটের সাথে টাইমস্ট্যাম্প অ্যালাইন করা: ডেটা হাই-ফিডেলিটি বজায় রাখতে, আপনার রেকর্ড করা টাইমস্ট্যাম্পের সাথে সেন্সরের আসল ফ্রিকোয়েন্সি ম্যাচ করুন।

পরীক্ষা করা

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

যাচাইকরণ টুল

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

কোয়ালিটি চেকলিস্ট

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

ওয়ার্কআউট প্রয়োগের মধ্যে সাধারণত এগুলি অন্তর্ভুক্ত থাকে:

কম্পোনেন্ট ম্যানেজ করে
সেশন কন্ট্রোলার সেশন স্টেট
টাইমার
ব্যাচিং লজিক
ডেটা টাইপ কন্ট্রোলার
লোকেশন স্যাম্পেলিং
রেপোজিটরি লেয়ার (Health Connect অপারেশন র‍্যাপ করে:) সেশন যোগ করা
ডেটার ধরন যোগ করা
রুট পয়েন্ট যোগ করা
সেশনের সারসংক্ষেপ পড়া
UI লেয়ার (ডিসপ্লে): সময়সীমা
লাইভ ডেটার ধরন
ম্যাপ প্রিভিউ
স্প্লিট ক্যালকুলেশন
লাইভ জিপিএস ট্রেস

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

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

ডিবাগ করার সাধারণ ধাপ

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