این راهنما با Health Connect نسخه 1.1.0-alpha12 سازگار است.
مسیرهای تمرین به کاربران امکان می دهد مسیر GPS را برای فعالیت های ورزشی مرتبط ردیابی کنند و نقشه های تمرینات خود را با سایر برنامه ها به اشتراک بگذارند.
این راهنما اطلاعاتی را در مورد نحوه درخواست مجوز از کاربر ارائه میکند و همچنین نحوه دریافت مجوز برای نوشتن دادههای مسیر را به عنوان بخشی از جلسه تمرین به برنامهها نشان میدهد.
در اینجا خلاصهای از عملکرد خواندن و نوشتن برای مسیرهای تمرین آمده است:
- برنامه ها یک مجوز نوشتن جدید برای مسیرهای تمرین ایجاد می کنند.
- درج با نوشتن یک جلسه تمرین با یک مسیر به عنوان میدان آن اتفاق می افتد.
- خواندن:
- برای صاحب جلسه، داده ها با استفاده از خواندن جلسه قابل دسترسی است.
- از یک برنامه شخص ثالث، از طریق یک گفتگو که به کاربر اجازه می دهد یک بار خواندن یک مسیر را بدهد.
درخواست مجوز از کاربر
پس از ایجاد یک نمونه مشتری، برنامه شما باید از کاربر مجوز درخواست کند. کاربران باید در هر زمانی اجازه دهند یا رد کنند.
برای انجام این کار، مجموعه ای از مجوزها را برای انواع داده های مورد نیاز ایجاد کنید. مطمئن شوید که ابتدا مجوزهای مجموعه در مانیفست اندروید شما اعلام شده است.
// Create a set of permissions for required data types
val PERMISSIONS =
setOf(
HealthPermission.getReadPermission(ExerciseSessionRecord::class),
HealthPermission.getWritePermission(ExerciseSessionRecord::class)
)
از getGrantedPermissions
استفاده کنید تا ببینید آیا برنامه شما قبلاً مجوزهای لازم را دارد یا خیر. اگر نه، از createRequestPermissionResultContract
برای درخواست آن مجوزها استفاده کنید. این صفحه مجوزهای Health Connect را نشان می دهد.
// Create the permissions launcher
val requestPermissionActivityContract = PermissionController.createRequestPermissionResultContract()
val requestPermissions = registerForActivityResult(requestPermissionActivityContract) { granted ->
if (granted.containsAll(PERMISSIONS)) {
// Permissions successfully granted
} else {
// Lack of required permissions
}
}
suspend fun checkPermissionsAndRun(healthConnectClient: HealthConnectClient) {
val granted = healthConnectClient.permissionController.getGrantedPermissions()
if (granted.containsAll(PERMISSIONS)) {
// Permissions already granted; proceed with inserting or reading data
} else {
requestPermissions.launch(PERMISSIONS)
}
}
از آنجایی که کاربران میتوانند در هر زمانی مجوزها را اعطا یا لغو کنند، برنامه شما باید بهطور دورهای مجوزهای اعطا شده را بررسی کند و سناریوهایی را که در آن مجوز از دست میرود رسیدگی کند.
مجوزهای نوشتن و خواندن مسیر تمرین
مسیرهای تمرین مجوز نوشتن زمان اجرا مخصوص به خود را دارند ( android.permission.health.WRITE_EXERCISE_ROUTE
).
برای افزودن قابلیت مسیر تمرین به برنامه خود، با درخواست مجوز نوشتن برای یک نوع داده خاص شروع کنید.
شما همچنین باید مجوز ورزش را اعلام کنید، زیرا هر مسیر با یک جلسه تمرین مرتبط است (یک جلسه = یک تمرین).
در اینجا مجوزی که باید اعلام کنید تا بتوانید مسیرهای تمرینی بنویسید آمده است:
<application>
<uses-permission
android:name="android.permission.health.WRITE_EXERCISE_ROUTE" />
<uses-permission
android:name="android.permission.health.WRITE_EXERCISE" />
...
</application>
برای خواندن مسیرهای تمرین، باید مجوزهای زیر را درخواست کنید:
<application>
<uses-permission
android:name="android.permission.health.READ_EXERCISE_ROUTES" />
<uses-permission
android:name="android.permission.health.READ_EXERCISE" />
...
</application>
برای درخواست مجوزها، هنگامی که برای اولین بار برنامه خود را به Health Connect متصل می کنید، از متد PermissionController.createRequestPermissionResultContract()
استفاده کنید. چندین مجوز که ممکن است بخواهید درخواست کنید عبارتند از:
- خواندن دادههای سلامت، از جمله دادههای مسیر:
HealthPermission.getReadPermission(ExerciseSessionRecord::class)
- نوشتن دادههای سلامت، از جمله دادههای مسیر:
HealthPermission.getWritePermission(ExerciseSessionRecord::class)
- نوشتن اطلاعات مسیر تمرین:
HealthPermission.PERMISSION_WRITE_EXERCISE_ROUTE
خواندن و نوشتن اطلاعات مسیر
برنامه ها با نوشتن یک جلسه با یک مسیر به عنوان فیلد، مسیری را وارد می کنند.
اگر کاربر مجوز نوشتن نداشته باشد و مسیر تنظیم نشده باشد، مسیر بهروزرسانی نمیشود.
اگر برنامه شما دارای مجوز نوشتن مسیر باشد و سعی کند یک جلسه را با عبور از یک شی جلسه بدون مسیر به روز کند، مسیر موجود حذف می شود.
هر زمان که برنامه شما نیاز به خواندن داده های مسیر ارائه شده توسط یک برنامه شخص ثالث داشته باشد، یک گفتگو ظاهر می شود که از کاربر می خواهد اجازه عملیات خواندن را بدهد.
درخواست مسیر از یک جلسه
در اینجا نحوه خواندن یک جلسه در Health Connect و درخواست مسیر از آن جلسه آمده است:
suspend fun readExerciseSessionAndRoute() {
val endTime = Instant.now()
val startTime = endTime.minus(Duration.ofHours(1))
val grantedPermissions =
healthConnectClient.permissionController.getGrantedPermissions()
if (!grantedPermissions.contains(
HealthPermission.getReadPermission(ExerciseSessionRecord::class))) {
// The user doesn't allow the app to read exercise session data.
return
}
val readResponse =
healthConnectClient.readRecords(
ReadRecordsRequest(
ExerciseSessionRecord::class,
TimeRangeFilter.between(startTime, endTime)
)
)
val exerciseRecord = readResponse.records.first()
val recordId = exerciseRecord.metadata.id
// See https://developer.android.com/training/basics/intents/result#launch
// for appropriately handling ActivityResultContract.
val requestExerciseRouteLauncher = fragment.registerForActivityResul
(ExerciseRouteRequestContract()) { exerciseRoute: ExerciseRoute? ->
if (exerciseRoute != null) {
displayExerciseRoute(exerciseRoute)
} else {
// Consent was denied
}
}
val exerciseSessionRecord =
healthConnectClient.readRecord(ExerciseSessionRecord::class, recordId).record
when (val exerciseRouteResult = exerciseSessionRecord.exerciseRouteResult) {
is ExerciseRouteResult.Data ->
displayExerciseRoute(exerciseRouteResult.exerciseRoute)
is ExerciseRouteResult.ConsentRequired ->
requestExerciseRouteLauncher.launch(recordId)
is ExerciseRouteResult.NoData -> Unit // No exercise route to show
else -> Unit
}
}
fun displayExerciseRoute(route: ExerciseRoute?) {
val locations = route.route.orEmpty()
for (location in locations) {
// Handle location.
}
}
یک مسیر از یک جلسه بنویسید
کد زیر نحوه ضبط یک جلسه شامل یک مسیر تمرین را نشان می دهد:
suspend fun InsertExerciseRoute(healthConnectClient: HealthConnectClient) {
val grantedPermissions =
healthConnectClient.permissionController.getGrantedPermissions()
if (!grantedPermissions.contains(
getWritePermission(ExerciseSessionRecord::class))) {
// The user doesn't allow the app to write exercise session data.
return
}
val sessionStartTime = Instant.now()
val sessionDuration = Duration.ofMinutes(20)
val sessionEndTime = sessionStartTime.plus(sessionDuration)
val exerciseRoute =
if (grantedPermissions.contains(PERMISSION_WRITE_EXERCISE_ROUTE)) ExerciseRoute(
listOf(
ExerciseRoute.Location(
// Location times must be on or after the session start time
time = sessionStartTime,
latitude = 6.5483,
longitude = 0.5488,
horizontalAccuracy = Length.meters(2.0),
verticalAccuracy = Length.meters(2.0),
altitude = Length.meters(9.0),
), ExerciseRoute.Location(
// Location times must be before the session end time
time = sessionEndTime.minusSeconds(1),
latitude = 6.4578,
longitude = 0.6577,
horizontalAccuracy = Length.meters(2.0),
verticalAccuracy = Length.meters(2.0),
altitude = Length.meters(9.2),
)
)
)
else
// The user doesn't allow the app to write exercise route data.
null
val exerciseSessionRecord = ExerciseSessionRecord(
startTime = sessionStartTime,
startZoneOffset = ZoneOffset.UTC,
endTime = sessionEndTime,
endZoneOffset = ZoneOffset.UTC,
exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_BIKING,
title = "Morning Bike Ride",
exerciseRoute = exerciseRoute,
metadata = Metadata.manualEntry(
device = Device(type = Device.TYPE_PHONE)
),
)
val response = healthConnectClient.insertRecords(listOf(exerciseSessionRecord))
}