এই নির্দেশিকাটি Health Connect সংস্করণ 1.1.0-alpha12 এর সাথে সামঞ্জস্যপূর্ণ।
হেলথ কানেক্টের সাথে একীভূত বেশিরভাগ অ্যাপের নিজস্ব ডেটাস্টোর থাকে যা সত্যের উৎস হিসেবে কাজ করে। হেলথ কানেক্ট আপনার অ্যাপকে সিঙ্কে রাখার উপায় প্রদান করে।
আপনার অ্যাপের আর্কিটেকচারের উপর নির্ভর করে, সিঙ্ক প্রক্রিয়াটিতে নিম্নলিখিত কিছু বা সমস্ত ক্রিয়া জড়িত থাকতে পারে:
- আপনার অ্যাপের ডেটাস্টোর থেকে Health Connect-এ নতুন বা আপডেট করা ডেটা ফিড করুন।
- হেলথ কানেক্ট থেকে ডেটা পরিবর্তনগুলি আপনার অ্যাপের ডেটাস্টোরে টেনে আনুন।
- আপনার অ্যাপের ডেটাস্টোর থেকে ডেটা মুছে ফেলা হলে Health Connect থেকে ডেটা মুছে ফেলুন।
প্রতিটি ক্ষেত্রেই, নিশ্চিত করুন যে সিঙ্কিং প্রক্রিয়াটি হেলথ কানেক্ট এবং আপনার অ্যাপের ডেটাস্টোর উভয়কেই সারিবদ্ধ রাখে।
হেলথ কানেক্টে ডেটা ফিড করুন
সিঙ্কিং প্রক্রিয়ার প্রথম অংশ হল আপনার অ্যাপের ডেটাস্টোর থেকে হেলথ কানেক্ট ডেটাস্টোরে ডেটা ফিড করা।
আপনার ডেটা প্রস্তুত করুন
সাধারণত, আপনার অ্যাপের ডেটাস্টোরের রেকর্ডগুলিতে নিম্নলিখিত বিবরণ থাকে:
- একটি অনন্য কী, যেমন একটি
UUID। - একটি সংস্করণ বা টাইমস্ট্যাম্প।
Health Connect-এ ডেটা সিঙ্ক করার সময়, শুধুমাত্র শেষ সিঙ্কের পর থেকে যে ডেটা সন্নিবেশ করা হয়েছে, আপডেট করা হয়েছে বা মুছে ফেলা হয়েছে তা সনাক্ত করুন এবং ফিড করুন।
Health Connect-এ ডেটা লিখুন
হেলথ কানেক্টে ডেটা ফিড করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন:
- আপনার অ্যাপের ডেটাস্টোর থেকে নতুন, আপডেট করা বা মুছে ফেলা এন্ট্রিগুলির একটি তালিকা পান।
- প্রতিটি এন্ট্রির জন্য, সেই ডেটা টাইপের জন্য উপযুক্ত একটি
Recordঅবজেক্ট তৈরি করুন। উদাহরণস্বরূপ, ওজন সম্পর্কিত ডেটার জন্য একটিWeightRecordঅবজেক্ট তৈরি করুন। প্রতিটি
Recordএর সাথে একটিMetadataঅবজেক্ট নির্দিষ্ট করুন। এর মধ্যে রয়েছেclientRecordId, যা আপনার অ্যাপের ডেটাস্টোরের একটি আইডি যা আপনি রেকর্ডটিকে অনন্যভাবে সনাক্ত করতে ব্যবহার করতে পারেন। আপনি এর জন্য আপনার বিদ্যমান অনন্য কী ব্যবহার করতে পারেন। যদি আপনার ডেটা ভার্সন করা হয়, তাহলে একটিclientRecordVersionও প্রদান করুন যা আপনার ডেটাতে ব্যবহৃত ভার্সনের সাথে সামঞ্জস্যপূর্ণ। যদি এটি ভার্সন না করা হয়, তাহলে আপনি বিকল্প হিসেবে বর্তমান টাইমস্ট্যাম্পেরLongমান ব্যবহার করতে পারেন।val recordVersion = 0L // Specify as needed // The clientRecordId is an ID that you choose for your record. This // is often the same ID you use in your app's datastore. val clientRecordId = "<your-record-id>" val record = WeightRecord( metadata = Metadata.activelyRecorded( clientRecordId = clientRecordId, clientRecordVersion = recordVersion, device = Device(type = Device.TYPE_SCALE) ), weight = Mass.kilograms(62.0), time = Instant.now(), zoneOffset = ZoneOffset.UTC, ) healthConnectClient.insertRecords(listOf()(record))insertRecordsব্যবহার করে Health Connect-এ ডেটা আপসার্ট করুন । ডেটা আপসার্ট করার অর্থ হল Health Connect-এ বিদ্যমান যেকোনো ডেটা ওভাররাইট করা হবে যতক্ষণ পর্যন্তclientRecordIdমান Health Connect ডেটাস্টোরে বিদ্যমান থাকে এবংclientRecordVersionবিদ্যমান মানের চেয়ে বেশি থাকে। অন্যথায়, আপসার্ট করা ডেটা নতুন ডেটা হিসাবে লেখা হবে।healthConnectClient.insertRecords(arrayListOf(record))
ডেটা ফিডিংয়ের ব্যবহারিক বিবেচ্য বিষয়গুলি সম্পর্কে জানতে, Write data এর সেরা অনুশীলনগুলি দেখুন।
স্টোর হেলথ কানেক্ট আইডি
যদি আপনার অ্যাপটি হেলথ কানেক্ট থেকে ডেটাও পড়ে, তাহলে রেকর্ড আপসার্ট করার পরে হেলথ কানেক্ট id সংরক্ষণ করুন। হেলথ কানেক্ট থেকে ডেটা পরিবর্তনগুলি সংগ্রহ করার সময় মুছে ফেলার প্রক্রিয়া করার জন্য আপনার এই id প্রয়োজন।
insertRecords ফাংশনটি একটি InsertRecordsResponse প্রদান করে যাতে id মানের তালিকা থাকে। Record ID গুলি পেতে এবং সেগুলি সংরক্ষণ করতে প্রতিক্রিয়াটি ব্যবহার করুন।
val response = healthConnectClient.insertRecords(arrayListOf(record))
for (recordId in response.recordIdsList) {
// Store recordId to your app's datastore
}
Health Connect থেকে ডেটা সংগ্রহ করুন
সিঙ্কিং প্রক্রিয়ার দ্বিতীয় অংশ হল Health Connect থেকে আপনার অ্যাপের ডেটাস্টোরে যেকোনো ডেটা পরিবর্তনের জন্য তথ্য সংগ্রহ করা। ডেটা পরিবর্তনের মধ্যে আপডেট এবং মুছে ফেলা অন্তর্ভুক্ত থাকতে পারে।
একটি পরিবর্তন টোকেন পান
Health Connect থেকে পরিবর্তনের তালিকা পেতে, আপনার অ্যাপটিকে Changes টোকেনগুলির ট্র্যাক রাখতে হবে। Changes অনুরোধ করার সময় আপনি ডেটা পরিবর্তনের তালিকা এবং পরের বার ব্যবহার করার জন্য একটি নতুন Changes টোকেন উভয়ই ফেরত দেওয়ার জন্য এগুলি ব্যবহার করতে পারেন।
একটি পরিবর্তন টোকেন পেতে, getChangesToken কল করুন এবং প্রয়োজনীয় ডেটা টাইপ সরবরাহ করুন।
val changesToken = healthConnectClient.getChangesToken(
ChangesTokenRequest(recordTypes = setOf(WeightRecord::class))
)
ডেটা পরিবর্তনের জন্য পরীক্ষা করুন
এখন যেহেতু আপনি একটি Changes টোকেন পেয়েছেন, তাই এটি ব্যবহার করে সমস্ত Changes পাবেন। আমরা আপনাকে সমস্ত Changes এর মধ্য দিয়ে যাওয়ার জন্য একটি লুপ তৈরি করার পরামর্শ দিচ্ছি যেখানে এটি উপলব্ধ ডেটা পরিবর্তন আছে কিনা তা পরীক্ষা করে। নিম্নলিখিত পদক্ষেপগুলি এখানে দেওয়া হল:
- Changes এর তালিকা পেতে টোকেন ব্যবহার করে
getChangesকল করুন। - প্রতিটি পরিবর্তনের ধরণ
UpsertionChangeনাকিDeletionChangeতা পরীক্ষা করে দেখুন এবং প্রয়োজনীয় ক্রিয়াকলাপগুলি সম্পাদন করুন।-
UpsertionChangeএর জন্য, শুধুমাত্র সেই পরিবর্তনগুলি নিন যা কলিং অ্যাপ থেকে আসেনি যাতে নিশ্চিত করা যায় যে আপনি ডেটা পুনরায় আমদানি করছেন না।
-
- পরবর্তী পরিবর্তন টোকেনটিকে আপনার নতুন টোকেন হিসেবে বরাদ্দ করুন।
- কোনও পরিবর্তন না হওয়া পর্যন্ত ধাপ ১-৩ পুনরাবৃত্তি করুন।
- পরবর্তী টোকেনটি সংরক্ষণ করুন এবং ভবিষ্যতে আমদানির জন্য এটি সংরক্ষণ করুন।
suspend fun processChanges(token: String): String {
var nextChangesToken = token
do {
val response = healthConnectClient.getChanges(nextChangesToken)
response.changes.forEach { change ->
when (change) {
is UpsertionChange ->
if (change.record.metadata.dataOrigin.packageName != context.packageName) {
processUpsertionChange(change)
}
is DeletionChange -> processDeletionChange(change)
}
}
nextChangesToken = response.nextChangesToken
} while (response.hasMore)
// Return and store the changes token for use next time.
return nextChangesToken
}
ডেটা সংগ্রহের ব্যবহারিক বিবেচ্য বিষয়গুলি সম্পর্কে জানতে, সিঙ্ক ডেটার জন্য সেরা অনুশীলনগুলি দেখুন।
প্রক্রিয়া তথ্য পরিবর্তন
আপনার অ্যাপের ডেটাস্টোরে পরিবর্তনগুলি প্রতিফলিত করুন। UpsertionChange এর জন্য, রেকর্ডটি আপসার্ট করতে এর metadata থেকে id এবং lastModifiedTime ব্যবহার করুন। DeletionChange এর জন্য, রেকর্ডটি মুছে ফেলার জন্য প্রদত্ত id ব্যবহার করুন। এর জন্য আপনাকে Store Health Connect IDs এ উল্লিখিত রেকর্ড id সংরক্ষণ করতে হবে।
Health Connect থেকে ডেটা মুছুন
যখন কোনও ব্যবহারকারী আপনার অ্যাপ থেকে তাদের নিজস্ব ডেটা মুছে ফেলেন, তখন নিশ্চিত করুন যে ডেটাটি Health Connect থেকেও মুছে ফেলা হয়েছে। এটি করার জন্য deleteRecords ব্যবহার করুন। এটি একটি রেকর্ড টাইপ এবং id এবং clientRecordId মানের তালিকা নেয়, যা মুছে ফেলার জন্য একাধিক ডেটা ব্যাচ করা সুবিধাজনক করে তোলে। একটি বিকল্প deleteRecords যা একটি timeRangeFilter নেয়RangeFilterও উপলব্ধ।
পরিধেয় ডিভাইস থেকে কম-বিলম্বিত সিঙ্ক্রোনাইজেশন
কম ল্যাটেন্সিতে একটি পরিধেয় ফিটনেস ডিভাইস থেকে Health Connect-এ ডেটা সিঙ্ক করতে, CompanionDeviceService ব্যবহার করুন। এই পদ্ধতিটি BLE GATT নোটিফিকেশন বা ইঙ্গিত সমর্থন করে এবং Android 8.0 (API লেভেল 26) বা তার বেশি টার্গেট করে এমন ডিভাইসগুলির জন্য কাজ করে। CompanionDeviceService আপনার অ্যাপকে পরিধেয় ডিভাইস থেকে ডেটা গ্রহণ করতে এবং Health Connect-এ লিখতে দেয়, এমনকি যখন অ্যাপটি ইতিমধ্যেই চালু না থাকে। BLE সেরা অনুশীলন সম্পর্কে আরও তথ্যের জন্য, Bluetooth Low Energy ওভারভিউ দেখুন।
ডিভাইসটি সংযুক্ত করুন
প্রথমে, আপনার অ্যাপটিকে CompanionDeviceManager ব্যবহার করে আপনার অ্যাপের সাথে পরিধেয় ডিভাইস সংযুক্ত করার জন্য ব্যবহারকারীকে এককালীন প্রক্রিয়ার মধ্য দিয়ে যেতে হবে। এটি আপনার অ্যাপটিকে ডিভাইসের সাথে ইন্টারঅ্যাক্ট করার জন্য প্রয়োজনীয় অনুমতি দেয়। আরও তথ্যের জন্য, Companion ডিভাইস পেয়ারিং দেখুন।
ম্যানিফেস্টে পরিষেবাটি ঘোষণা করুন
এরপর, আপনার অ্যাপের ম্যানিফেস্ট ফাইলে CompanionDeviceService ঘোষণা করুন। আপনার AndroidManifest.xml এ নিম্নলিখিতটি যোগ করুন:
<manifest ...>
<application ...>
<service
android:name=".MyWearableService"
android:exported="true"
android:permission="android.permission.BIND_COMPANION_DEVICE_SERVICE">
<intent-filter>
<action android:name="android.companion.CompanionDeviceService" />
</intent-filter>
</service>
</application>
</manifest>
CompanionDeviceService তৈরি করুন
অবশেষে, এমন একটি ক্লাস তৈরি করুন যা CompanionDeviceService প্রসারিত করে। এই পরিষেবাটি পরিধেয় ডিভাইসের সাথে সংযোগ পরিচালনা করে এবং BLE GATT কলব্যাকের মাধ্যমে ডেটা গ্রহণ করে। নতুন ডেটা প্রাপ্ত হলে, তা অবিলম্বে Health Connect-এ লেখা হয়।
import android.companion.CompanionDeviceService
import android.bluetooth.BluetoothGatt
import android.bluetooth.BluetoothGattCallback
import android.bluetooth.BluetoothGattCharacteristic
import androidx.health.connect.client.permission.HealthPermission
import androidx.health.connect.client.HealthConnectClient
import androidx.health.connect.client.records.HeartRateRecord
import androidx.health.connect.client.records.StepsRecord
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch
class MyWearableService : CompanionDeviceService() {
// A coroutine scope for handling suspend functions like writing to Health Connect
private val serviceScope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
private var healthConnectClient: HealthConnectClient? = null
private var bluetoothGatt: BluetoothGatt? = null
// This is called by the system when your wearable connects
override fun onDeviceAppeared(address: String) {
super.onDeviceAppeared(address)
healthConnectClient = HealthConnectClient.getOrCreate(this)
serviceScope.launch {
// Check which permissions have been granted before subscribing to data from the wearable.
// A service cannot request permissions, so your app must have already requested
// and been granted them from an Activity.
val granted = healthConnectClient?.permissionController?.getGrantedPermissions()
// ... set up your GATT connection here ...
// Once connected, subscribe to notifications for the data types you have
// permission to write.
if (granted?.contains(HealthPermission.getWritePermission(HeartRateRecord::class)) == true) {
// subscribeToHeartRate(bluetoothGatt)
}
}
}
// The core of your low-latency pipeline is the BLE callback
private val gattCallback = object : BluetoothGattCallback() {
override fun onCharacteristicChanged(gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic, value: ByteArray) {
super.onCharacteristicChanged(gatt, characteristic, value)
// 1. Instantly receive the data
val rawData = value
// 2. Parse the data from the wearable
val healthData = parseWearableData(rawData) // Your custom parsing logic
// 3. Immediately process it. For simplicity, this example writes
// directly to Health Connect. A real-world app might write to its
// own datastore first and then sync with Health Connect.
serviceScope.launch {
writeToHealthConnect(healthData)
}
}
}
private suspend fun writeToHealthConnect(healthData: HealthData) {
val records = prepareHealthConnectRecords(healthData) // Convert to Health Connect records
try {
healthConnectClient?.insertRecords(records)
} catch (e: Exception) {
// Handle exceptions
}
}
// This is called by the system when your wearable disconnects
override fun onDeviceDisappeared(address: String) {
super.onDeviceDisappeared(address)
// Clean up your GATT connection and other resources
bluetoothGatt?.close()
}
}
ডেটা সিঙ্ক করার জন্য সেরা পদ্ধতি
নিম্নলিখিত বিষয়গুলি সিঙ্কিং প্রক্রিয়াকে প্রভাবিত করে।
টোকেনের মেয়াদ শেষ
যেহেতু একটি অব্যবহৃত পরিবর্তন টোকেনের মেয়াদ 30 দিনের মধ্যে শেষ হয়ে যায়, তাই আপনাকে অবশ্যই একটি সিঙ্ক কৌশল ব্যবহার করতে হবে যা এই ক্ষেত্রে তথ্য হারানো এড়াবে। আপনার কৌশলটিতে নিম্নলিখিত পদ্ধতিগুলি অন্তর্ভুক্ত থাকতে পারে:
- আপনার অ্যাপ ডেটাস্টোরে অনুসন্ধান করুন যেটি সম্প্রতি ব্যবহৃত রেকর্ড, যার একটি Health Connect
idআছে। - Health Connect থেকে একটি নির্দিষ্ট টাইমস্ট্যাম্প দিয়ে শুরু হওয়া রেকর্ডের অনুরোধ করুন এবং তারপর আপনার অ্যাপের ডেটাস্টোরে সেগুলি সন্নিবেশ বা আপডেট করুন।
- পরবর্তী প্রয়োজনে এটি সংরক্ষণ করার জন্য একটি পরিবর্তন টোকেনের অনুরোধ করুন।
প্রস্তাবিত পরিবর্তন ব্যবস্থাপনা কৌশল
যদি আপনার অ্যাপটি অবৈধ বা মেয়াদোত্তীর্ণ পরিবর্তন টোকেন পেয়ে যায়, তাহলে আপনার লজিকে এর প্রয়োগের উপর নির্ভর করে আমরা নিম্নলিখিত ব্যবস্থাপনা কৌশলগুলি সুপারিশ করি:
- সমস্ত তথ্য পড়ুন এবং নকল করুন । এটি সবচেয়ে আদর্শ কৌশল।
- Health Connect থেকে তারা শেষবার যখন ডেটা পড়েছিল তার টাইমস্ট্যাম্প সংরক্ষণ করুন।
- টোকেনের মেয়াদ শেষ হয়ে গেলে, সাম্প্রতিক টাইমস্ট্যাম্প বা গত 30 দিনের সমস্ত ডেটা পুনরায় পড়ুন। তারপর, শনাক্তকারী ব্যবহার করে পূর্বে পঠিত ডেটার সাথে এটিকে ডিডুয়েট করুন।
- আদর্শভাবে, ক্লায়েন্ট আইডি বাস্তবায়ন করুন কারণ ডেটা আপডেটের জন্য এগুলি প্রয়োজন।
- শুধুমাত্র শেষ পঠিত টাইমস্ট্যাম্প থেকে পঠিত ডেটা । এর ফলে পরিবর্তন টোকেনের মেয়াদ শেষ হওয়ার সময় কিছু ডেটার অসঙ্গতি দেখা দেয়, তবে সময়কাল কম থাকে যার জন্য কয়েক ঘন্টা থেকে কয়েক দিন সময় লাগতে পারে।
- Health Connect থেকে তারা শেষবার যখন ডেটা পড়েছিল তার টাইমস্ট্যাম্প সংরক্ষণ করুন।
- টোকেনের মেয়াদ শেষ হওয়ার পরে, এই টাইমস্ট্যাম্প থেকে পরবর্তী সমস্ত ডেটা পড়ুন।
- গত ৩০ দিনের ডেটা মুছে ফেলুন এবং পড়ুন । এটি প্রথম ইন্টিগ্রেশনে যা ঘটে তার সাথে আরও ঘনিষ্ঠভাবে সারিবদ্ধ হয়।
- গত 30 দিনের জন্য Health Connect থেকে অ্যাপ দ্বারা পঠিত সমস্ত ডেটা মুছে ফেলুন।
- একবার মুছে ফেলা হলে, এই সমস্ত ডেটা আবার পড়ুন।
- গত ৩০ দিনের ডেটা ডিডুপ না করে পড়ুন । এটি সবচেয়ে আদর্শ কৌশল, এবং এর ফলে ব্যবহারকারীদের কাছে ডুপ্লিকেট ডেটা প্রদর্শিত হয়।
- গত 30 দিনের জন্য Health Connect থেকে অ্যাপ দ্বারা পঠিত সমস্ত ডেটা মুছে ফেলুন।
- ডুপ্লিকেট এন্ট্রির অনুমতি দিন।
ডেটা টাইপ পরিবর্তন টোকেন
যদি আপনার অ্যাপটি একাধিক ডেটা টাইপ স্বাধীনভাবে ব্যবহার করে, তাহলে প্রতিটি ডেটা টাইপের জন্য আলাদা আলাদা Changes Tokens ব্যবহার করুন। Changes Sync API-এর সাথে একাধিক ডেটা টাইপের তালিকা ব্যবহার করুন যদি এই ডেটা টাইপগুলি একসাথে ব্যবহার করা হয় অথবা একেবারেই না করা হয়।
ফোরগ্রাউন্ড রিডস
অ্যাপগুলি কেবল তখনই Health Connect থেকে ডেটা পড়তে পারে যখন তারা ফোরগ্রাউন্ডে থাকে। Health Connect থেকে ডেটা সিঙ্ক করার সময়, Health Connect-এ অ্যাক্সেস যেকোনো সময় বাধাগ্রস্ত হতে পারে। উদাহরণস্বরূপ, Health Connect থেকে প্রচুর পরিমাণে ডেটা পড়ার সময় সিঙ্কের মাঝখানে আপনার অ্যাপটিকে বাধাগুলি মোকাবেলা করতে হবে এবং পরের বার অ্যাপটি খোলার সময় চালিয়ে যেতে হবে।
পটভূমি পাঠ
আপনি আপনার অ্যাপ্লিকেশনটিকে ব্যাকগ্রাউন্ডে চালানোর এবং হেলথ কানেক্ট থেকে ডেটা পড়ার অনুরোধ করতে পারেন। আপনি যদি Background Read অনুমতি চান, তাহলে আপনার ব্যবহারকারী আপনার অ্যাপটিকে ব্যাকগ্রাউন্ডে ডেটা পড়ার অ্যাক্সেস দিতে পারবেন।
আমদানির সময়
যেহেতু আপনার অ্যাপটি নতুন ডেটা সম্পর্কে বিজ্ঞপ্তি পাচ্ছে না, তাই দুটি পয়েন্টে নতুন ডেটার জন্য পরীক্ষা করুন:
- প্রতিবার যখন আপনার অ্যাপটি ফোরগ্রাউন্ডে সক্রিয় হয়। এই ক্ষেত্রে, লাইফসাইকেল ইভেন্ট ব্যবহার করুন।
- আপনার অ্যাপটি যখন সামনের দিকে থাকে, তখন পর্যায়ক্রমে। নতুন ডেটা উপলব্ধ হলে ব্যবহারকারীদের অবহিত করুন, যাতে তারা পরিবর্তনগুলি প্রতিফলিত করতে তাদের স্ক্রিন আপডেট করতে পারে।