নিম্নলিখিত উদাহরণটি আপনাকে দেখায় যে সাধারণ কর্মপ্রবাহের অংশ হিসাবে কীভাবে কাঁচা ডেটা পড়তে হয়।
তথ্য পড়ুন
হেলথ কানেক্ট অ্যাপগুলিকে ডেটাস্টোর থেকে ডেটা পড়ার অনুমতি দেয় যখন অ্যাপটি ফোরগ্রাউন্ড এবং ব্যাকগ্রাউন্ডে থাকে:
ফোরগ্রাউন্ডে লেখা আছে : আপনার অ্যাপটি যখন ফোরগ্রাউন্ডে থাকে তখন আপনি সাধারণত হেলথ কানেক্ট থেকে ডেটা পড়তে পারেন। এই ক্ষেত্রে, ব্যবহারকারী বা সিস্টেম যদি রিড অপারেশনের সময় আপনার অ্যাপটিকে ব্যাকগ্রাউন্ডে রাখে, তাহলে আপনি এই অপারেশনটি চালানোর জন্য একটি ফোরগ্রাউন্ড পরিষেবা ব্যবহার করার কথা বিবেচনা করতে পারেন।
ব্যাকগ্রাউন্ড রিড : ব্যবহারকারীর কাছ থেকে অতিরিক্ত অনুমতি চাওয়ার মাধ্যমে, ব্যবহারকারী বা সিস্টেম আপনার অ্যাপটি ব্যাকগ্রাউন্ডে রাখার পরে আপনি ডেটা পড়তে পারবেন। সম্পূর্ণ ব্যাকগ্রাউন্ড রিড উদাহরণটি দেখুন।
Health Connect-এর Steps ডেটা টাইপ ব্যবহারকারীর দ্বারা রিডিং-এর মধ্যে নেওয়া পদক্ষেপের সংখ্যা ক্যাপচার করে। ধাপ গণনা স্বাস্থ্য, ফিটনেস এবং সুস্থতা প্ল্যাটফর্ম জুড়ে একটি সাধারণ পরিমাপ উপস্থাপন করে। Health Connect আপনাকে ধাপ গণনা ডেটা পড়তে এবং লিখতে দেয়।
রেকর্ড পড়ার জন্য, একটি ReadRecordsRequest তৈরি করুন এবং readRecords কল করার সময় এটি সরবরাহ করুন।
নিম্নলিখিত উদাহরণটি দেখায় কিভাবে একটি নির্দিষ্ট সময়ের মধ্যে একজন ব্যবহারকারীর জন্য ধাপ গণনার তথ্য পড়তে হয়। SensorManager এর সাথে একটি বর্ধিত উদাহরণের জন্য, ধাপ গণনার তথ্য নির্দেশিকাটি দেখুন।
suspend fun readStepsByTimeRange(
healthConnectClient: HealthConnectClient,
startTime: Instant,
endTime: Instant
) {
try {
val response = healthConnectClient.readRecords(
ReadRecordsRequest(
StepsRecord::class,
timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
)
)
for (record in response.records) {
// Process each record
}
} catch (e: Exception) {
// Run error handling here
}
}
আপনি aggregate ব্যবহার করে আপনার ডেটা একত্রিত পদ্ধতিতেও পড়তে পারেন।
suspend fun readStepsByTimeRange(
healthConnectClient: HealthConnectClient,
startTime: Instant,
endTime: Instant
) {
try {
val response = healthConnectClient.aggregate(
AggregateRequest(
metrics = setOf(StepsRecord.COUNT_TOTAL),
timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
)
)
// The result may be null if no data is available in the time range
val stepCount = response[StepsRecord.COUNT_TOTAL]
} catch (e: Exception) {
// Run error handling here
}
}
মোবাইলের ধাপগুলি পড়ুন
অ্যান্ড্রয়েড ১৪ (এপিআই লেভেল ৩৪) এবং এসডিকে এক্সটেনশন ভার্সন ২০ বা তার বেশি হলে, হেলথ কানেক্ট ডিভাইসে ধাপ গণনা প্রদান করে। যদি কোনও অ্যাপকে READ_STEPS অনুমতি দেওয়া হয়, তাহলে হেলথ কানেক্ট অ্যান্ড্রয়েড-চালিত ডিভাইস থেকে ধাপগুলি ক্যাপচার করা শুরু করে এবং ব্যবহারকারীরা হেলথ কানেক্ট স্টেপস এন্ট্রিতে স্বয়ংক্রিয়ভাবে ধাপের ডেটা যুক্ত হতে দেখে।
ডিভাইসে ধাপ গণনা উপলব্ধ কিনা তা পরীক্ষা করার জন্য, আপনাকে যাচাই করতে হবে যে ডিভাইসটি Android 14 (API লেভেল 34) চালাচ্ছে এবং কমপক্ষে SDK এক্সটেনশন সংস্করণ 20 আছে। আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:
val isStepTrackingAvailable =
Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE &&
SdkExtensions.getExtensionVersion(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) >= 20
Health Connect দ্বারা ধারণ করা মোবাইল ধাপগুলির DataOrigin প্যাকেজ নাম android এ সেট করা আছে। যদি আপনার অ্যাপটি aggregate ব্যবহার করে কেবল সমষ্টিগত ধাপ গণনা পড়ে এবং DataOrigin দ্বারা ফিল্টার না করে, তাহলে ডিভাইসের ধাপগুলি স্বয়ংক্রিয়ভাবে মোটের মধ্যে অন্তর্ভুক্ত হয়ে যায়।
যদি আপনার অ্যাপের ডিভাইসের ধাপগুলি পড়ার প্রয়োজন হয়, অথবা যদি এটি সোর্স অ্যাপ্লিকেশন বা ডিভাইস অনুসারে বিভক্ত ধাপের ডেটা প্রদর্শন করে, তাহলে আপনি DataOrigin কোথায় android তা রেকর্ডের জন্য অনুসন্ধান করতে পারেন। যদি আপনার অ্যাপটি ধাপের ডেটার জন্য অ্যাট্রিবিউশন দেখায়, তাহলে আপনার android প্যাকেজ থেকে বর্তমান ডিভাইসে ডেটা অ্যাট্রিবিউট করা উচিত। আপনি "Your phone" এর মতো একটি লেবেল ব্যবহার করে, Settings.Global.getString(resolver, Settings.Global.DEVICE_NAME) দিয়ে ডিভাইসের নাম পুনরুদ্ধার করে, অথবা রেকর্ডের মেটাডেটাতে Device ক্ষেত্রটি পরিদর্শন করে এটি করতে পারেন।
নিম্নলিখিত উদাহরণে android ডেটা অরিজিনের জন্য ফিল্টার করে একত্রিত মোবাইল স্টেপ কাউন্ট ডেটা কীভাবে পড়তে হয় তা দেখানো হয়েছে:
suspend fun readStepsByTimeRange(
healthConnectClient: HealthConnectClient,
startTime: Instant,
endTime: Instant
) {
try {
val response = healthConnectClient.aggregate(
AggregateRequest(
metrics = setOf(StepsRecord.COUNT_TOTAL),
timeRangeFilter = TimeRangeFilter.between(startTime, endTime),
dataOriginFilter = setOf(DataOrigin("android"))
)
)
// The result may be null if no data is available in the time range
val stepCount = response[StepsRecord.COUNT_TOTAL]
} catch (e: Exception) {
// Run error handling here
}
}
ডিভাইসে ধাপ গণনা
ডিভাইসে ধাপ গণনা বৈশিষ্ট্যটির আরও গভীরে প্রবেশ করা:
- সেন্সর ব্যবহার : Health Connect
SensorManagerএরTYPE_STEP_COUNTERসেন্সর ব্যবহার করে। এই সেন্সরটি কম বিদ্যুৎ খরচের জন্য অপ্টিমাইজ করা হয়েছে, যা এটিকে ক্রমাগত ব্যাকগ্রাউন্ড স্টেপ ট্র্যাকিংয়ের জন্য আদর্শ করে তোলে। - ডেটা গ্রানুলারিটি : ব্যাটারির আয়ু বাঁচাতে, স্টেপ ডেটা সাধারণত ব্যাচ করা হয় এবং হেলথ কানেক্ট ডাটাবেসে প্রতি মিনিটে একবারের বেশি লেখা হয় না।
- অ্যাট্রিবিউশন : যেমনটি আগেই উল্লেখ করা হয়েছে, এই অন-ডিভাইস বৈশিষ্ট্য দ্বারা রেকর্ড করা সমস্ত পদক্ষেপ
DataOriginএ থাকাandroidপ্যাকেজের নামের সাথে সম্পর্কিত। - সক্রিয়করণ : ডিভাইসে ধাপ গণনা প্রক্রিয়াটি কেবল তখনই সক্রিয় থাকে যখন ডিভাইসে কমপক্ষে একটি অ্যাপ্লিকেশনকে Health Connect-এর মধ্যে
READ_STEPSঅনুমতি দেওয়া হয়।
পটভূমি পড়ার উদাহরণ
ব্যাকগ্রাউন্ডে ডেটা পড়ার জন্য, আপনার ম্যানিফেস্ট ফাইলে নিম্নলিখিত অনুমতি ঘোষণা করুন:
<application>
<uses-permission android:name="android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND" />
...
</application>
নিম্নলিখিত উদাহরণে WorkManager ব্যবহার করে একটি নির্দিষ্ট সময়ের মধ্যে একজন ব্যবহারকারীর জন্য পটভূমিতে ধাপ গণনার ডেটা কীভাবে পড়তে হয় তা দেখানো হয়েছে:
class ScheduleWorker(private val appContext: Context, workerParams: WorkerParameters):
CoroutineWorker(appContext, workerParams) {
override suspend fun doWork(): Result {
// Read data and process it.
...
// Return success indicating successful data retrieval
return Result.success()
}
}
if (healthConnectClient
.features
.getFeatureStatus(
HealthConnectFeatures.FEATURE_READ_HEALTH_DATA_IN_BACKGROUND
) == HealthConnectFeatures.FEATURE_STATUS_AVAILABLE) {
// Check if necessary permission is granted
val grantedPermissions = healthConnectClient.permissionController.getGrantedPermissions()
if (PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND !in grantedPermissions) {
// Perform read in foreground
...
} else {
// Schedule the periodic work request in background
val periodicWorkRequest = PeriodicWorkRequestBuilder<ScheduleWorker>(1, TimeUnit.HOURS)
.build()
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
"read_health_connect",
ExistingPeriodicWorkPolicy.KEEP,
periodicWorkRequest
)
}
} else {
// Background reading is not available, perform read in foreground
...
}
ReadRecordsRequest প্যারামিটারের ডিফল্ট pageSize মান ১০০০। যদি একটি readResponse এ রেকর্ডের সংখ্যা অনুরোধের pageSize এর চেয়ে বেশি হয়, তাহলে pageToken ব্যবহার করে সমস্ত রেকর্ড পুনরুদ্ধার করার জন্য আপনাকে প্রতিক্রিয়ার সমস্ত পৃষ্ঠা পুনরাবৃত্তি করতে হবে। তবে, রেট-সীমাবদ্ধকরণের উদ্বেগ এড়াতে সতর্ক থাকুন।
পেজটোকেন পড়ার উদাহরণ
অনুরোধকৃত সময়কাল থেকে সমস্ত উপলব্ধ ডেটা পুনরুদ্ধার করার জন্য রেকর্ড পড়ার জন্য pageToken ব্যবহার করার পরামর্শ দেওয়া হচ্ছে।
নিচের উদাহরণটি দেখায় যে সমস্ত পৃষ্ঠা টোকেন শেষ না হওয়া পর্যন্ত কীভাবে সমস্ত রেকর্ড পড়তে হয়:
val type = HeartRateRecord::class
val endTime = Instant.now()
val startTime = endTime.minus(Duration.ofDays(7))
try {
var pageToken: String? = null
do {
val readResponse =
healthConnectClient.readRecords(
ReadRecordsRequest(
recordType = type,
timeRangeFilter = TimeRangeFilter.between(
startTime,
endTime
),
pageToken = pageToken
)
)
val records = readResponse.records
// Do something with records
pageToken = readResponse.pageToken
} while (pageToken != null)
} catch (quotaError: IllegalStateException) {
// Backoff
}
বৃহৎ ডেটাসেট পড়ার সময় সর্বোত্তম অনুশীলন সম্পর্কে তথ্যের জন্য, প্ল্যান টু এভয়েড রেট লিমিটিং দেখুন।
পূর্বে লিখিত তথ্য পড়ুন
যদি কোনও অ্যাপ আগে হেলথ কানেক্টে রেকর্ড লিখে থাকে, তাহলে সেই অ্যাপের পক্ষে ঐতিহাসিক ডেটা পড়া সম্ভব। এটি এমন পরিস্থিতিতে প্রযোজ্য যেখানে ব্যবহারকারী পুনরায় ইনস্টল করার পরে অ্যাপটিকে হেলথ কানেক্টের সাথে পুনরায় সিঙ্ক করতে হয়।
কিছু পঠন বিধিনিষেধ প্রযোজ্য:
অ্যান্ড্রয়েড ১৪ এবং তার পরবর্তী ভার্সনের জন্য
- কোনও অ্যাপের নিজস্ব ডেটা পড়ার কোনও ঐতিহাসিক সীমা নেই।
- অন্য ডেটা পড়ার জন্য অ্যাপের ৩০ দিনের সীমা।
Android 13 এবং তার আগের ভার্সনের জন্য
- অ্যাপের যেকোনো ডেটা পড়ার ৩০ দিনের সীমা।
পড়ার অনুমতির অনুরোধ করে বিধিনিষেধগুলি অপসারণ করা যেতে পারে।
ঐতিহাসিক তথ্য পড়ার জন্য, আপনার ReadRecordsRequest এর dataOriginFilter প্যারামিটারে প্যাকেজের নামটি DataOrigin অবজেক্ট হিসেবে নির্দেশ করতে হবে।
নিম্নলিখিত উদাহরণে হৃদস্পন্দনের রেকর্ড পড়ার সময় প্যাকেজের নাম কীভাবে নির্দেশ করতে হয় তা দেখানো হয়েছে:
try {
val response = healthConnectClient.readRecords(
ReadRecordsRequest(
recordType = HeartRateRecord::class,
timeRangeFilter = TimeRangeFilter.between(startTime, endTime),
dataOriginFilter = setOf(DataOrigin("com.my.package.name"))
)
)
for (record in response.records) {
// Process each record
}
} catch (e: Exception) {
// Run error handling here
}
৩০ দিনের বেশি পুরনো ডেটা পড়ুন
ডিফল্টরূপে, সমস্ত অ্যাপ্লিকেশন কোনও অনুমতি প্রথম মঞ্জুর হওয়ার 30 দিন আগে পর্যন্ত Health Connect থেকে ডেটা পড়তে পারে।
যদি আপনার ডিফল্ট বিধিনিষেধের বাইরে পড়ার অনুমতি বাড়ানোর প্রয়োজন হয়, তাহলে PERMISSION_READ_HEALTH_DATA_HISTORY অনুরোধ করুন। অন্যথায়, এই অনুমতি ছাড়া, 30 দিনের বেশি পুরনো রেকর্ড পড়ার চেষ্টা করলে একটি ত্রুটি দেখা দেয়।
মুছে ফেলা অ্যাপের অনুমতির ইতিহাস
যদি কোনও ব্যবহারকারী আপনার অ্যাপটি মুছে ফেলেন, তাহলে ইতিহাসের অনুমতি সহ সমস্ত অনুমতি বাতিল করা হবে। যদি ব্যবহারকারী আপনার অ্যাপটি পুনরায় ইনস্টল করে আবার অনুমতি দেয়, তাহলে একই ডিফল্ট বিধিনিষেধ প্রযোজ্য হবে এবং আপনার অ্যাপটি সেই নতুন তারিখের 30 দিন আগে পর্যন্ত Health Connect থেকে ডেটা পড়তে পারবে।
উদাহরণস্বরূপ, ধরুন ব্যবহারকারী ১০ মে, ২০২৩ তারিখে আপনার অ্যাপটি মুছে ফেলেন এবং তারপর ১৫ মে, ২০২৩ তারিখে অ্যাপটি পুনরায় ইনস্টল করেন এবং পড়ার অনুমতি দেন। আপনার অ্যাপটি এখন ডিফল্টভাবে ডেটা পড়ার প্রথম তারিখ হল ১৫ এপ্রিল, ২০২৩ ।
ব্যতিক্রমগুলি পরিচালনা করুন
কোনও সমস্যার সম্মুখীন হলে Health Connect CRUD অপারেশনের জন্য স্ট্যান্ডার্ড ব্যতিক্রমগুলি প্রদান করে। আপনার অ্যাপের উচিত যথাযথভাবে এই ব্যতিক্রমগুলি ধরা এবং পরিচালনা করা।
HealthConnectClient এর প্রতিটি পদ্ধতিতে এমন ব্যতিক্রমগুলি তালিকাভুক্ত করা হয়েছে যা থ্রো করা যেতে পারে। সাধারণভাবে, আপনার অ্যাপটি নিম্নলিখিত ব্যতিক্রমগুলি পরিচালনা করবে:
| ব্যতিক্রম | বিবরণ | প্রস্তাবিত সেরা অনুশীলন |
|---|---|---|
IllegalStateException | নিম্নলিখিত পরিস্থিতিগুলির মধ্যে একটি ঘটেছে:
| কোনও অনুরোধ করার আগে ইনপুটগুলির সাথে সম্ভাব্য সমস্যাগুলি প্রথমে সমাধান করুন। আপনার অনুরোধগুলিতে সরাসরি ব্যবহার করার পরিবর্তে, ভেরিয়েবলগুলিতে মান নির্ধারণ করুন অথবা একটি কাস্টম ফাংশনের মধ্যে প্যারামিটার হিসাবে ব্যবহার করুন যাতে আপনি ত্রুটি পরিচালনার কৌশলগুলি প্রয়োগ করতে পারেন। |
IOException | ডিস্ক থেকে তথ্য পড়ার এবং লেখার সময় কিছু সমস্যার সম্মুখীন হতে হচ্ছে। | এই সমস্যা এড়াতে, এখানে কিছু পরামর্শ দেওয়া হল:
|
RemoteException | SDK যে অন্তর্নিহিত পরিষেবার সাথে সংযুক্ত, তার মধ্যে বা যোগাযোগের সময় ত্রুটি ঘটেছে। উদাহরণস্বরূপ, আপনার অ্যাপটি একটি নির্দিষ্ট uid ব্যবহার করে একটি রেকর্ড মুছে ফেলার চেষ্টা করছে। তবে, অ্যাপটি অন্তর্নিহিত পরিষেবাটি পরীক্ষা করার পরে জানতে পারে যে রেকর্ডটি বিদ্যমান নেই, তখন ব্যতিক্রমটি বাতিল করা হয়। | এই সমস্যা এড়াতে, এখানে কিছু পরামর্শ দেওয়া হল:
|
SecurityException | অনুরোধগুলির জন্য অনুমতির প্রয়োজন হলে কিছু সমস্যার সম্মুখীন হতে হয় যা মঞ্জুর করা হয় না। | এটি এড়াতে, নিশ্চিত করুন যে আপনি আপনার প্রকাশিত অ্যাপের জন্য Health Connect ডেটা টাইপের ব্যবহার ঘোষণা করেছেন। এছাড়াও, আপনাকে ম্যানিফেস্ট ফাইল এবং আপনার কার্যকলাপে Health Connect অনুমতিগুলি ঘোষণা করতে হবে। |