এই নির্দেশিকাটি Health Connect সংস্করণ 1.1.0-alpha11 এর সাথে সামঞ্জস্যপূর্ণ।
হেলথ কানেক্ট একটি পরিকল্পিত ব্যায়াম ডেটা টাইপ প্রদান করে যাতে ট্রেনিং প্ল্যান লেখার জন্য ট্রেনিং অ্যাপস এবং ওয়ার্কআউট অ্যাপগুলিকে ট্রেনিং প্ল্যান পড়তে সক্ষম করে। রেকর্ড করা ব্যায়াম (ওয়ার্কআউট) ব্যবহারকারীদের তাদের প্রশিক্ষণের লক্ষ্য অর্জনে সহায়তা করার জন্য ব্যক্তিগতকৃত কর্মক্ষমতা বিশ্লেষণের জন্য আবার পড়া যেতে পারে।
বৈশিষ্ট্য প্রাপ্যতা
একজন ব্যবহারকারীর ডিভাইস স্বাস্থ্য সংযোগে প্রশিক্ষণ পরিকল্পনা সমর্থন করে কিনা তা নির্ধারণ করতে, ক্লায়েন্টে FEATURE_PLANNED_EXERCISE
এর উপলব্ধতা পরীক্ষা করুন:
if (healthConnectClient
.features
.getFeatureStatus(
HealthConnectFeatures.FEATURE_PLANNED_EXERCISE
) == HealthConnectFeatures.FEATURE_STATUS_AVAILABLE) {
// Feature is available
} else {
// Feature isn't available
}
আরও জানতে বৈশিষ্ট্য উপলব্ধতার জন্য পরীক্ষা করুন দেখুন।
প্রয়োজনীয় অনুমতি
প্রশিক্ষণ পরিকল্পনার অ্যাক্সেস নিম্নলিখিত অনুমতি দ্বারা সুরক্ষিত:
-
android.permission.health.READ_PLANNED_EXERCISE
-
android.permission.health.WRITE_PLANNED_EXERCISE
আপনার অ্যাপের জন্য প্লে কনসোলে, সেইসাথে আপনার অ্যাপের ম্যানিফেস্টে এই অনুমতিগুলি ঘোষণা করুন:
<application>
<uses-permission
android:name="android.permission.health.READ_PLANNED_EXERCISE" />
<uses-permission
android:name="android.permission.health.WRITE_PLANNED_EXERCISE" />
...
</application>
আপনি আপনার ডিভাইস এবং অ্যাপ্লিকেশানগুলিতে ব্যবহার করতে চান এমন সমস্ত উপযুক্ত অনুমতি ঘোষণা করার জন্য আপনি দায়ী৷ ব্যবহার করার আগে ব্যবহারকারীর দ্বারা প্রতিটি অনুমতি দেওয়া হয়েছে কিনা তাও আপনার পরীক্ষা করা উচিত।
সম্পর্কিত অনুমতি
প্রশিক্ষণ পরিকল্পনাগুলি ব্যায়াম সেশনের সাথে যুক্ত। তাই, হেলথ কানেক্টের এই বৈশিষ্ট্যটি সম্পূর্ণরূপে ব্যবহার করার জন্য ব্যবহারকারীকে প্রশিক্ষণ পরিকল্পনার সাথে সম্পর্কিত প্রতিটি রেকর্ডের প্রকার ব্যবহার করার অনুমতি দিতে হবে।
উদাহরণ স্বরূপ, যদি একটি ট্রেনিং প্ল্যান একাধিক রানের সময় ব্যবহারকারীর হার্ট রেট পরিমাপ করে, তাহলে ব্যায়াম সেশন লেখার জন্য এবং পরবর্তী মূল্যায়নের জন্য ফলাফলগুলি পড়ার জন্য নিম্নলিখিত অনুমতিগুলি বিকাশকারীর দ্বারা ঘোষণা করা এবং ব্যবহারকারীর দ্বারা মঞ্জুর করতে হতে পারে:
-
android.permission.health.READ_EXERCISE
-
android.permission.health.READ_EXERCISE_ROUTE
-
android.permission.health.READ_HEART_RATE
-
android.permission.health.WRITE_EXERCISE
-
android.permission.health.WRITE_EXERCISE_ROUTE
-
android.permission.health.WRITE_HEART_RATE
যাইহোক, প্রায়শই যে অ্যাপটি প্রশিক্ষণের পরিকল্পনা তৈরি করে এবং পরিকল্পনার বিপরীতে কর্মক্ষমতা মূল্যায়ন করে তা সেই অ্যাপের মতো নয় যা প্রশিক্ষণের পরিকল্পনা গ্রহণ করে এবং প্রকৃত অনুশীলনের ডেটা লেখে। অ্যাপের ধরণের উপর নির্ভর করে, সমস্ত পড়ার এবং লেখার অনুমতির প্রয়োজন হবে না। উদাহরণস্বরূপ, প্রতিটি ধরনের অ্যাপের জন্য আপনার শুধুমাত্র এই অনুমতিগুলির প্রয়োজন হতে পারে:
প্রশিক্ষণ পরিকল্পনা অ্যাপ্লিকেশন | ওয়ার্কআউট অ্যাপ |
---|---|
WRITE_PLANNED_EXERCISE | READ_PLANNED_EXERCISE |
READ_EXERCISE | WRITE_EXERCISE |
READ_EXERCISE_ROUTE | WRITE_EXERCISE_ROUTE |
READ_HEART_RATE | WRITE_HEART_RATE |
একটি পরিকল্পিত ব্যায়াম সেশন রেকর্ড অন্তর্ভুক্ত তথ্য
- অধিবেশনের শিরোনাম।
- পরিকল্পিত ব্যায়াম ব্লকের একটি তালিকা।
- অধিবেশন শুরু এবং শেষ সময়.
- ব্যায়ামের ধরন।
- কার্যকলাপের জন্য নোট.
- মেটাডেটা।
- সম্পূর্ণ ব্যায়াম সেশন আইডি — এই পরিকল্পিত ব্যায়াম সেশনের সাথে সম্পর্কিত একটি ব্যায়াম সেশন সম্পূর্ণ হওয়ার পরে এটি স্বয়ংক্রিয়ভাবে লেখা হয়।
একটি পরিকল্পিত ব্যায়াম ব্লক রেকর্ড অন্তর্ভুক্ত তথ্য
একটি পরিকল্পিত ব্যায়াম ব্লকে ব্যায়ামের ধাপগুলির একটি তালিকা রয়েছে, বিভিন্ন ধাপের পুনরাবৃত্তি সমর্থন করার জন্য (উদাহরণস্বরূপ, আর্ম কার্ল, বার্পি এবং ক্রাঞ্চের একটি ক্রম পরপর পাঁচবার করুন)।
- ব্লকের বর্ণনা।
- পরিকল্পিত ব্যায়াম পদক্ষেপের একটি তালিকা।
- পুনরাবৃত্তির সংখ্যা।
একটি পরিকল্পিত ব্যায়াম ধাপ রেকর্ড অন্তর্ভুক্ত তথ্য
- ধাপের বর্ণনা।
- ব্যায়াম বিভাগ ।
- ব্যায়ামের ধরন ।
- কর্মক্ষমতা লক্ষ্য একটি তালিকা.
- সমাপ্তির লক্ষ্য ।
সমর্থিত সমষ্টি
এই ডেটা টাইপের জন্য কোন সমর্থিত সমষ্টি নেই।
উদাহরণ ব্যবহার
ধরুন একজন ব্যবহারকারী এখন থেকে দুই দিন পর 90 মিনিটের দৌড়ের পরিকল্পনা করছেন। এই দৌড়ে 90 এবং 110 bpm এর মধ্যে লক্ষ্য হার্ট রেট সহ একটি লেকের চারপাশে তিনটি ল্যাপ দেখাবে।
- নিম্নলিখিত সহ একটি পরিকল্পিত অনুশীলন সেশন ব্যবহারকারী দ্বারা একটি প্রশিক্ষণ পরিকল্পনা অ্যাপে সংজ্ঞায়িত করা হয়েছে:
- পরিকল্পিত শুরু এবং রান শেষ
- ব্যায়ামের ধরন (চলমান)
- ল্যাপের সংখ্যা (পুনরাবৃত্তি)
- হৃদস্পন্দনের জন্য কর্মক্ষমতা লক্ষ্য (90 এবং 110 bpm এর মধ্যে)
- এই তথ্যটি ব্যায়াম ব্লক এবং ধাপে গোষ্ঠীভুক্ত করা হয়েছে এবং একটি
PlannedExerciseSessionRecord
হিসাবে প্রশিক্ষণ পরিকল্পনা অ্যাপের মাধ্যমে Health Connect-এ লেখা হয়েছে। - ব্যবহারকারী পরিকল্পিত সেশন সঞ্চালন (চলমান)।
- সেশন সম্পর্কিত ব্যায়াম ডেটা হয় রেকর্ড করা হয়:
- অধিবেশন চলাকালীন একটি পরিধানযোগ্য দ্বারা. উদাহরণস্বরূপ, হৃদস্পন্দন। এই ডেটা ক্রিয়াকলাপের রেকর্ড প্রকার হিসাবে Health Connect-এ লেখা হয়। এই ক্ষেত্রে,
HeartRateRecord
। - সেশনের পরে ব্যবহারকারী দ্বারা ম্যানুয়ালি। উদাহরণস্বরূপ, প্রকৃত রানের শুরু এবং শেষ নির্দেশ করা। এই ডেটা একটি
ExerciseSessionRecord
হিসাবে Health Connect-এ লেখা হয়েছে।
- অধিবেশন চলাকালীন একটি পরিধানযোগ্য দ্বারা. উদাহরণস্বরূপ, হৃদস্পন্দন। এই ডেটা ক্রিয়াকলাপের রেকর্ড প্রকার হিসাবে Health Connect-এ লেখা হয়। এই ক্ষেত্রে,
- পরবর্তী সময়ে, প্রশিক্ষণ পরিকল্পনা অ্যাপটি পরিকল্পিত অনুশীলন সেশনে ব্যবহারকারীর দ্বারা নির্ধারিত লক্ষ্যগুলির বিপরীতে প্রকৃত কর্মক্ষমতা মূল্যায়ন করতে Health Connect থেকে ডেটা পড়ে।
অনুশীলনের পরিকল্পনা করুন এবং লক্ষ্য নির্ধারণ করুন
একজন ব্যবহারকারী ভবিষ্যতে তাদের অনুশীলনের পরিকল্পনা করতে পারে এবং লক্ষ্য নির্ধারণ করতে পারে। একটি পরিকল্পিত ব্যায়াম সেশন হিসাবে Health Connect-এ এটি লিখুন।
উদাহরণ ব্যবহারে বর্ণিত উদাহরণে, ব্যবহারকারী এখন থেকে দুই দিন 90 মিনিটের দৌড়ের পরিকল্পনা করে। এই দৌড়ে 90 এবং 110 bpm এর মধ্যে লক্ষ্য হার্ট রেট সহ একটি লেকের চারপাশে তিনটি ল্যাপ দেখাবে।
এই ধরনের একটি স্নিপেট এমন একটি অ্যাপের ফর্ম হ্যান্ডলারে পাওয়া যেতে পারে যা স্বাস্থ্য সংযোগে পরিকল্পিত ব্যায়াম সেশনগুলি লগ করে। এটি ইন্টিগ্রেশনের জন্য ইনজেস্ট পয়েন্টেও পাওয়া যেতে পারে, এমন একটি পরিষেবা যা প্রশিক্ষণ দেয়।
// Ensure the user has granted all necessary permissions for this task
val grantedPermissions =
healthConnectClient.permissionController.getGrantedPermissions()
if (!grantedPermissions.contains(
HealthPermission.getWritePermission(PlannedExerciseSessionRecord::class))) {
// The user hasn't granted the app permission to write planned exercise session data.
return
}
val plannedDuration = Duration.ofMinutes(90)
val plannedStartDate = LocalDate.now().plusDays(2)
val plannedExerciseSessionRecord = PlannedExerciseSessionRecord(
startDate = plannedStartDate,
duration = plannedDuration,
exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_RUNNING,
blocks = listOf(
PlannedExerciseBlock(
repetitions = 1, steps = listOf(
PlannedExerciseStep(
exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_RUNNING,
exercisePhase = PlannedExerciseStep.EXERCISE_PHASE_ACTIVE,
completionGoal = ExerciseCompletionGoal.RepetitionsGoal(repetitions = 3),
performanceTargets = listOf(
ExercisePerformanceTarget.HeartRateTarget(
minHeartRate = 90.0, maxHeartRate = 110.0
)
)
),
), description = "Three laps around the lake"
)
),
title = "Run at lake",
notes = null
)
val insertedPlannedExerciseSessions =
healthConnectClient.insertRecords(listOf(plannedExerciseSessionRecord)).recordIdsList
val insertedPlannedExerciseSessionId = insertedPlannedExerciseSessions.first()
লগ ব্যায়াম এবং কার্যকলাপ ডেটা
দুই দিন পরে, ব্যবহারকারী প্রকৃত ব্যায়াম সেশন লগ. এটিকে একটি ব্যায়াম সেশন হিসাবে Health Connect-এ লিখুন।
এই উদাহরণে, ব্যবহারকারীর সেশনের সময়কাল পরিকল্পিত সময়কালের সাথে ঠিক মিলেছে।
নিম্নলিখিত স্নিপেটটি এমন একটি অ্যাপের ফর্ম হ্যান্ডলারে পাওয়া যেতে পারে যা স্বাস্থ্য সংযোগে ব্যায়াম সেশনগুলি লগ করে। এটি ব্যায়াম সেশন সনাক্ত এবং লগিং করতে সক্ষম পরিধানযোগ্য জন্য ডেটা ইনজেস্ট এবং এক্সপোর্ট হ্যান্ডলারগুলিতেও পাওয়া যেতে পারে।
এখানে insertedPlannedExerciseSessionId
পূর্ববর্তী উদাহরণ থেকে পুনরায় ব্যবহার করা হয়েছে। একটি বাস্তব অ্যাপে, ব্যবহারকারী বিদ্যমান সেশনের তালিকা থেকে একটি পরিকল্পিত অনুশীলন সেশন নির্বাচন করে আইডি নির্ধারণ করবে।
// Ensure the user has granted all necessary permissions for this task
val grantedPermissions =
healthConnectClient.permissionController.getGrantedPermissions()
if (!grantedPermissions.contains(
HealthPermission.getWritePermission(ExerciseSessionRecord::class))) {
// The user doesn't granted the app permission to write exercise session data.
return
}
val sessionDuration = Duration.ofMinutes(90)
val sessionEndTime = Instant.now()
val sessionStartTime = sessionEndTime.minus(sessionDuration)
val exerciseSessionRecord = ExerciseSessionRecord(
startTime = sessionStartTime,
startZoneOffset = ZoneOffset.UTC,
endTime = sessionEndTime,
endZoneOffset = ZoneOffset.UTC,
exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_RUNNING,
segments = listOf(
ExerciseSegment(
startTime = sessionStartTime,
endTime = sessionEndTime,
repetitions = 3,
segmentType = ExerciseSegment.EXERCISE_SEGMENT_TYPE_RUNNING
)
),
title = "Run at lake",
plannedExerciseSessionId = insertedPlannedExerciseSessionId,
)
val insertedExerciseSessions =
healthConnectClient.insertRecords(listOf(exerciseSessionRecord))
একটি পরিধানযোগ্য এছাড়াও রান জুড়ে তাদের হৃদস্পন্দন লগ. নিম্নলিখিত স্নিপেটটি লক্ষ্য সীমার মধ্যে রেকর্ড তৈরি করতে ব্যবহার করা যেতে পারে।
একটি বাস্তব অ্যাপে, এই স্নিপেটের প্রাথমিক অংশগুলি পরিধানযোগ্য একটি বার্তার জন্য হ্যান্ডলারে পাওয়া যেতে পারে, যা সংগ্রহের সময় স্বাস্থ্য সংযোগে পরিমাপ লিখবে।
// Ensure the user has granted all necessary permissions for this task
val grantedPermissions =
healthConnectClient.permissionController.getGrantedPermissions()
if (!grantedPermissions.contains(
HealthPermission.getWritePermission(HeartRateRecord::class))) {
// The user doesn't granted the app permission to write heart rate record data.
return
}
val samples = mutableListOf<HeartRateRecord.Sample>()
var currentTime = sessionStartTime
while (currentTime.isBefore(sessionEndTime)) {
val bpm = Random.nextInt(21) + 90
val heartRateRecord = HeartRateRecord.Sample(
time = currentTime,
beatsPerMinute = bpm.toLong(),
)
samples.add(heartRateRecord)
currentTime = currentTime.plusSeconds(180)
}
val heartRateRecord = HeartRateRecord(
startTime = sessionStartTime,
startZoneOffset = ZoneOffset.UTC,
endTime = sessionEndTime,
endZoneOffset = ZoneOffset.UTC,
samples = samples,
)
val insertedHeartRateRecords = healthConnectClient.insertRecords(listOf(heartRateRecord))
কর্মক্ষমতা লক্ষ্য মূল্যায়ন
ব্যবহারকারীর ওয়ার্কআউটের পরের দিন, আপনি লগ করা ব্যায়াম পুনরুদ্ধার করতে পারেন, কোন পরিকল্পিত ব্যায়ামের লক্ষ্যগুলি পরীক্ষা করতে পারেন এবং সেট লক্ষ্য পূরণ হয়েছে কিনা তা নির্ধারণ করতে অতিরিক্ত ডেটা প্রকারগুলি মূল্যায়ন করতে পারেন৷
পারফরম্যান্স লক্ষ্যগুলি মূল্যায়ন করার জন্য বা অনুশীলনের একটি তালিকা লোড করার সময় এবং একটি অ্যাপে কর্মক্ষমতা লক্ষ্য সম্পর্কে একটি বিজ্ঞপ্তি প্রদর্শন করার সময় এই ধরনের একটি স্নিপেট সম্ভবত একটি পর্যায়ক্রমিক কাজের মধ্যে পাওয়া যাবে।
// Ensure the user has granted all necessary permissions for this task
val grantedPermissions =
healthConnectClient.permissionController.getGrantedPermissions()
if (!grantedPermissions.containsAll(
listOf(
HealthPermission.getReadPermission(ExerciseSessionRecord::class),
HealthPermission.getReadPermission(PlannedExerciseSessionRecord::class),
HealthPermission.getReadPermission(HeartRateRecord::class)
)
)
) {
// The user doesn't granted the app permission to read exercise session record data.
return
}
val searchDuration = Duration.ofDays(1)
val searchEndTime = Instant.now()
val searchStartTime = searchEndTime.minus(searchDuration)
val response = healthConnectClient.readRecords(
ReadRecordsRequest<ExerciseSessionRecord>(
timeRangeFilter = TimeRangeFilter.between(searchStartTime, searchEndTime)
)
)
for (exerciseRecord in response.records) {
val plannedExerciseRecordId = exerciseRecord.plannedExerciseSessionId
val plannedExerciseRecord =
if (plannedExerciseRecordId == null) null else healthConnectClient.readRecord(
PlannedExerciseSessionRecord::class, plannedExerciseRecordId
).record
if (plannedExerciseRecord != null) {
val aggregateRequest = AggregateRequest(
metrics = setOf(HeartRateRecord.BPM_AVG),
timeRangeFilter = TimeRangeFilter.between(
exerciseRecord.startTime, exerciseRecord.endTime
),
)
val aggregationResult = healthConnectClient.aggregate(aggregateRequest)
val maxBpm = aggregationResult[HeartRateRecord.BPM_MAX]
val minBpm = aggregationResult[HeartRateRecord.BPM_MIN]
if (maxBpm != null && minBpm != null) {
plannedExerciseRecord.blocks.forEach { block ->
block.steps.forEach { step ->
step.performanceTargets.forEach { target ->
when (target) {
is ExercisePerformanceTarget.HeartRateTarget -> {
val minTarget = target.minHeartRate
val maxTarget = target.maxHeartRate
if(
minBpm >= minTarget && maxBpm <= maxTarget
) {
// Success!
}
}
// Handle more target types
}
}
}
}
}
}
}
}