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

আপনি যদি এমন কোনও অ্যাপ তৈরি করতে চান যা ব্যবহারকারীর গুরুত্বপূর্ণ তথ্য ম্যানেজ করে, তাহলে আপনি Health Connect ব্যবহার করে এই ধরনের কাজ করতে পারবেন:

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

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

এক নজরে: বিস্তারিত ভাইটাল ট্র্যাকার তৈরি করা

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

  • গুরুত্বপূর্ণ ডেটা ধরনের জন্য উপযুক্ত অনুমতি চাওয়া।
  • BloodPressureRecord, HeartRateRecord ও অন্যান্য ভাইটাল রেকর্ড ব্যবহার করে ভাইটাল ডেটা লেখা।
  • ডিসপ্লে, বিশ্লেষণ বা সিঙ্ক করার জন্য ভাইটাল ডেটা পড়া।
  • ডেটা লেখা ও পড়ার ক্ষেত্রে ব্যাচিং ব্যবহার করা।

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

শুরু করার আগে

গুরুত্বপূর্ণ ফিচার প্রয়োগ করার আগে:

মূল ধারণা

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

গুরুত্বপূর্ণ ডেটার ধরন

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

  • BloodPressureRecord: একটি ব্লাড প্রেসার রিডিংকে বোঝায়, এর মধ্যে সিস্টোলিক ও ডায়াস্টোলিক প্রেসার এবং শরীরের পজিশন অন্তর্ভুক্ত।
  • HeartRateRecord: হার্ট রেট পরিমাপের একটি সিরিজকে বোঝায়।
  • RestingHeartRateRecord: বিশ্রামকালীন হার্ট রেটের একটি পরিমাপকে বোঝায়।
  • BodyTemperatureRecord: একটি শরীরের তাপমাত্রা রিডিং, পরিমাপের লোকেশন সহ দেখায়।
  • BloodGlucoseRecord: একটি ব্লাড গ্লুকোজ রিডিংকে বোঝায়, যার মধ্যে খাবার ও নমুনা সোর্সের সাথে সম্পর্ক অন্তর্ভুক্ত।
  • OxygenSaturationRecord: একটি ব্লাড অক্সিজেন স্যাচুরেশন রিডিং দেখায়।
  • RespiratoryRateRecord: শ্বাস-প্রশ্বাসের হার একবার পরিমাপ করা হলে তা এখানে দেখানো হয়।

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

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

ভাইটাল ডেটা সংবেদনশীল হতে পারে এবং সেন্সর বা ব্যবহারকারীর ইনপুট থেকে পাওয়া মাপের উত্তর হিসেবে অ্যাপকে ডেটা লিখতে হতে পারে অথবা ব্যাকএন্ড থেকে ডেটা সিঙ্ক করতে হতে পারে। ভাইটাল ডেটা ম্যানেজ করার জন্য অনুমতি খুবই গুরুত্বপূর্ণ।

অনুমতি

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

  • রক্তচাপ: BloodPressureRecord-এর জন্য দেখার ও লেখার অনুমতি।
  • হার্ট রেট: HeartRateRecord-এর জন্য রিড ও রাইট পার্মিশন।
  • বিশ্রামকালীন হার্ট রেট: RestingHeartRateRecord-এর জন্য রিড ও রাইট পার্মিশন।
  • শরীরের তাপমাত্রা: BodyTemperatureRecord-এর জন্য রিড ও রাইট অনুমতি।
  • ব্লাড গ্লুকোজ: BloodGlucoseRecord-এর জন্য রিড ও রাইট পার্মিশন।
  • অক্সিজেন স্যাচুরেশন: OxygenSaturationRecord-এর জন্য রিড ও রাইট পার্মিশন।
  • শ্বাস-প্রশ্বাসের হার: RespiratoryRateRecord-এর জন্য রিড ও রাইট পার্মিশন।

নিম্নলিখিত উদাহরণে কীভাবে রক্তচাপ, হার্ট রেট ও শরীরের তাপমাত্রা সংক্রান্ত অনুমতি চাওয়া যায় তা দেখানো হয়েছে:

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

val permissions =
    setOf(
        HealthPermission.getReadPermission(BloodPressureRecord::class),
        HealthPermission.getWritePermission(BloodPressureRecord::class),
        HealthPermission.getReadPermission(HeartRateRecord::class),
        HealthPermission.getWritePermission(HeartRateRecord::class),
        HealthPermission.getReadPermission(BodyTemperatureRecord::class),
        HealthPermission.getWritePermission(BodyTemperatureRecord::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_BLOOD_PRESSURE
  • android.permission.health.WRITE_BLOOD_PRESSURE

আপনার অ্যাপে ব্লাড প্রেসার সংক্রান্ত সুবিধা যোগ করতে, BloodPressureRecord ডেটা টাইপের জন্য অনুমতি চেয়ে শুরু করুন।

ব্লাড প্রেসার লেখার জন্য আপনাকে এই অনুমতি ঘোষণা করতে হবে:

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

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

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

ভাইটাল ডেটা লেখা

এই বিভাগে Health Connect-এ কীভাবে ভাইটাল ডেটা লেখা হয় তা বর্ণনা করা হয়েছে। ভাইটাল ডেটা সাধারণত আলাদা আলাদা রেকর্ড হিসেবে লেখা হয়। আপনি যদি একসাথে একাধিক রেকর্ড লেখেন, যেমন কোনও সেন্সর বা ব্যাকএন্ড থেকে সিঙ্ক করা, তাহলে ব্যাচিং ব্যবহার করুন।

BloodPressureRecord লেখার উদাহরণ:

suspend fun writeBloodPressureRecord(healthConnectClient: HealthConnectClient) {
    val record = BloodPressureRecord(
        time = Instant.now(),
        zoneOffset = ZoneOffset.UTC,
        systolic = Pressure.millimetersOfMercury(120.0),
        diastolic = Pressure.millimetersOfMercury(80.0),
        bodyPosition = BloodPressureRecord.BODY_POSITION_SITTING_DOWN,
        measurementLocation = BloodPressureRecord.MEASUREMENT_LOCATION_LEFT_WRIST
    )
    healthConnectClient.insertRecords(listOf(record))
}

ব্যাচ রাইটিং

আপনার অ্যাপকে যদি একাধিক ডেটা পয়েন্ট লিখতে হয়, যেমন, কোনও কানেক্ট করা ডিভাইস বা ব্যাকএন্ড পরিষেবা থেকে ডেটা সিঙ্ক করা, তাহলে আপনাকে দক্ষতা উন্নত করতে এবং ব্যাটারি খরচ কমাতে ব্যাচ রাইট ব্যবহার করতে হবে। Health Connect একটি রাইট রিকোয়েস্টে সর্বাধিক ১০০০ রেকর্ড হ্যান্ডেল করতে পারে।

নিচের কোড থেকে কীভাবে একাধিক রেকর্ড একবারে ব্যাচ-রাইট করতে হয় তা জানতে পারবেন:

suspend fun writeBatchRecords(healthConnectClient: HealthConnectClient) {
    val bloodPressureRecord = BloodPressureRecord(
        time = Instant.now(),
        zoneOffset = ZoneOffset.UTC,
        systolic = Pressure.millimetersOfMercury(120.0),
        diastolic = Pressure.millimetersOfMercury(80.0),
        bodyPosition = BloodPressureRecord.BODY_POSITION_SITTING_DOWN,
        measurementLocation = BloodPressureRecord.MEASUREMENT_LOCATION_LEFT_WRIST
    )
    val heartRateRecord = HeartRateRecord(
        startTime = Instant.now().minusSeconds(60),
        startZoneOffset = ZoneOffset.UTC,
        endTime = Instant.now(),
        endZoneOffset = ZoneOffset.UTC,
        samples = listOf(HeartRateRecord.Sample(time = Instant.now().minusSeconds(30), beatsPerMinute = 80))
    )
    healthConnectClient.insertRecords(listOf(bloodPressureRecord, heartRateRecord))
}

ভাইটাল ডেটা পড়া

অ্যাপগুলি পরিমাপ দেখাতে, ট্রেন্ড বিশ্লেষণ করতে বা এক্সটার্নাল সার্ভারের সাথে ডেটা সিঙ্ক করতে ভাইটাল ডেটা পড়তে পারে। ভাইটাল রিডিং পেতে, নির্দিষ্ট রেকর্ড টাইপ সহ ReadRecordsRequest ব্যবহার করুন এবং সময়ের রেঞ্জ অনুসারে ফিল্টার করুন।

BloodPressureRecord ডেটা পড়ার উদাহরণ:

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

    for (record in response.records) {
        // Process each blood pressure record
        val systolic = record.systolic
        val diastolic = record.diastolic
    }
}

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

পেশাদার পদ্ধতি

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

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

পরীক্ষা করা

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

যাচাইকরণ টুল

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

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

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

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

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

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

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

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

অনুমতির স্ট্যাটাস চেক করুন। রিড বা রাইট অপারেশন করার আগে সবসময় getPermissionStatus()-কে কল করুন। ব্যবহারকারী যেকোনও সময় সিস্টেম সেটিংস থেকে অনুমতি প্রত্যাহার করতে পারবেন।