با Health Connect تجربیات ورزشی خود را توسعه دهید

اگر به دنبال ایجاد یک تجربه ورزشی در برنامه خود هستید، می‌توانید از Health Connect برای انجام کارهایی مانند موارد زیر استفاده کنید:

  • جلسات تمرینی بنویسید
  • مسیرهای تمرین را بنویسید
  • معیارهای تمرین مانند ضربان قلب، سرعت و مسافت را بنویسید
  • خواندن داده‌های تمرین از برنامه‌های دیگر

این راهنما نحوه ساخت این ویژگی‌های تمرینی را شرح می‌دهد و انواع داده‌ها، اجرای پس‌زمینه، مجوزها، گردش‌های کاری توصیه‌شده و بهترین شیوه‌ها را پوشش می‌دهد.

مرور کلی: ساخت یک ردیاب جامع تمرین

شما می‌توانید با دنبال کردن این مراحل اصلی، یک تجربه جامع ردیابی تمرین با استفاده از Health Connect ایجاد کنید:

  • پیاده‌سازی صحیح مجوزها بر اساس مجوزهای سلامت.
  • ضبط جلسات با استفاده از ExerciseSessionRecord
  • نوشتن مداوم داده‌های تمرین در طول جلسه.
  • مدیریت صحیح اجرای پس‌زمینه برای تأیید ضبط مداوم داده‌ها.
  • خواندن داده‌های جلسه برای خلاصه‌سازی و تجزیه و تحلیل پس از تمرین.

این گردش کار، قابلیت همکاری با سایر برنامه‌های Health Connect را فراهم می‌کند و دسترسی به داده‌ها تحت کنترل کاربر را تأیید می‌کند.

قبل از اینکه شروع کنی

قبل از اجرای ویژگی‌های تمرین:

مفاهیم کلیدی

Health Connect داده‌های تمرین را با استفاده از چند مؤلفه اصلی نمایش می‌دهد. یک ExerciseSessionRecord به عنوان رکورد مرکزی برای یک تمرین عمل می‌کند و شامل جزئیاتی مانند زمان شروع یا پایان و نوع تمرین است. در طول یک جلسه، انواع داده‌های مختلف مانند HeartRateRecord یا SpeedRecord می‌توانند ثبت شوند. برای فعالیت‌های خارج از منزل، ExerciseRoute داده‌های GPS را ذخیره می‌کند که به جلسه مربوطه مرتبط است.

جلسات تمرینی

رکورد ExerciseSessionRecord رکورد مرکزی برای داده‌های تمرین است که نشان‌دهنده یک جلسه تمرین واحد است. هر رکورد موارد زیر را ذخیره می‌کند:

  • startTime
  • endTime
  • exerciseType
  • فراداده‌های اختیاری جلسه (عنوان، یادداشت‌ها)

یک ExerciseSessionRecord همچنین می‌تواند شامل مسیرهای تمرینی، دورها و بخش‌هایی از آن به عنوان بخشی از داده‌های خود باشد. علاوه بر این، انواع داده‌های دیگری مانند HeartRateRecord یا SpeedRecord را می‌توان در طول یک جلسه ثبت کرد و با آن مرتبط ساخت.

انواع داده‌های مرتبط

داده‌های مرتبط با جلسات تمرینی توسط انواع رکوردهای فردی نمایش داده می‌شوند. انواع رایج عبارتند از:

  • HeartRateRecord : مجموعه‌ای از اندازه‌گیری‌های ضربان قلب را نشان می‌دهد.
  • SpeedRecord : مجموعه‌ای از اندازه‌گیری‌های سرعت را نشان می‌دهد.
  • DistanceRecord : مسافت طی شده بین قرائت‌ها را نشان می‌دهد.
  • TotalCaloriesBurnedRecord : نشان دهنده کل کالری‌های سوزانده شده بین دو اندازه‌گیری است.
  • ElevationGainedRecord ): نشان‌دهنده افزایش ارتفاع بین قرائت‌ها است.
  • StepsCadenceRecord : نشان‌دهنده‌ی گام‌های آهنگین بین قرائت‌ها است.
  • PowerRecord : نشان‌دهنده‌ی توان خروجی بین قرائت‌ها است که در فعالیت‌هایی مانند دوچرخه‌سواری رایج است.

برای فهرست کاملی از انواع داده‌ها، به انواع داده‌های Health Connect مراجعه کنید.

مسیرهای ورزشی

شما می‌توانید با استفاده از ExerciseRoute یک مسیر را به تمرینات فضای باز مرتبط کنید. مسیرها از اشیاء ExerciseRoute.Location متوالی تشکیل شده‌اند که هر کدام شامل موارد زیر هستند:

  • طول و عرض جغرافیایی
  • ارتفاع اختیاری
  • بلبرینگ اختیاری
  • اطلاعات دقت
  • مهر زمانی

مسیرهای جلسه را پیوند دهید

یک ExerciseRoute شامل داده‌های مکانی ترتیبی برای یک جلسه تمرین است. این رکورد در Health Connect به عنوان یک رکورد مستقل در نظر گرفته نمی‌شود. در عوض، شما داده‌های ExerciseRoute را هنگام درج یا به‌روزرسانی یک ExerciseSessionRecord ارائه می‌دهید.

ملاحظات توسعه

برنامه‌های ردیابی تمرین اغلب نیاز دارند برای مدت طولانی، اغلب در پس‌زمینه، زمانی که صفحه نمایش خاموش است، اجرا شوند. هنگام ایجاد ویژگی‌های تمرین، مهم است که نحوه مدیریت اجرای پس‌زمینه و درخواست مجوزهای لازم برای داده‌های تمرین را در نظر بگیرید.

اجرای پس‌زمینه

برنامه‌های ورزشی معمولاً با صفحه نمایش خاموش اجرا می‌شوند. در این حالت، باید از موارد زیر استفاده کنید:

  • سرویس‌های پیش‌زمینه برای مکان‌یابی و نمونه‌برداری حسگر
  • WorkManager برای نوشتن یا همگام‌سازی معوق
  • استراتژی‌های دسته‌بندی برای نوشتن منظم رکورد

با ثابت نگه داشتن شناسه جلسه در تمام نوشتن‌ها، پیوستگی را حفظ کنید.

مجوزها

برنامه شما قبل از خواندن یا نوشتن داده‌های تمرین، باید مجوزهای مربوط به Health Connect را درخواست کند. مجوزهای رایج برای تمرینات شامل جلسات ورزشی، مسیرهای ورزشی و معیارهایی مانند ضربان قلب یا سرعت است. این موارد شامل موارد زیر است:

  • جلسات تمرین: مجوزهای خواندن و نوشتن برای ExerciseSessionRecord .
  • مسیرهای تمرین: مجوزهای خواندن و نوشتن برای ExerciseRoute .
  • ضربان قلب: مجوزهای خواندن و نوشتن برای HeartRateRecord .
  • سرعت: مجوزهای خواندن و نوشتن برای SpeedRecord .
  • فاصله: مجوزهای خواندن و نوشتن برای DistanceRecord .
  • کالری‌ها: مجوزهای خواندن و نوشتن برای TotalCaloriesBurnedRecord .
  • ارتفاع کسب‌شده: مجوزهای خواندن و نوشتن برای ElevationGainedRecord .
  • Steps Cadence: مجوزهای خواندن و نوشتن برای StepsCadenceRecord .
  • قدرت: مجوزهای خواندن و نوشتن برای PowerRecord .
  • مراحل: مجوزهای خواندن و نوشتن برای StepsRecord .

در زیر مثالی از نحوه درخواست چندین مجوز برای یک جلسه تمرینی که شامل داده‌های مسیر، ضربان قلب، مسافت، کالری، سرعت و تعداد قدم‌ها می‌شود، نشان داده شده است:

پس از ایجاد یک نمونه کلاینت، برنامه شما باید از کاربر درخواست مجوز کند. کاربران باید بتوانند در هر زمانی مجوزها را اعطا یا رد کنند.

برای انجام این کار، مجموعه‌ای از مجوزها را برای انواع داده‌های مورد نیاز ایجاد کنید. مطمئن شوید که مجوزهای موجود در مجموعه ابتدا در مانیفست اندروید شما تعریف شده‌اند.

// Create a set of permissions for required data types
val PERMISSIONS =
    setOf(
  HealthPermission.getReadPermission(ExerciseSessionRecord::class),
  HealthPermission.getWritePermission(ExerciseSessionRecord::class),
  HealthPermission.getReadPermission(ExerciseRoute::class),
  HealthPermission.getWritePermission(ExerciseRoute::class),
  HealthPermission.getReadPermission(HeartRateRecord::class),
  HealthPermission.getWritePermission(HeartRateRecord::class),
  HealthPermission.getReadPermission(SpeedRecord::class),
  HealthPermission.getWritePermission(SpeedRecord::class),
  HealthPermission.getReadPermission(DistanceRecord::class),
  HealthPermission.getWritePermission(DistanceRecord::class),
  HealthPermission.getReadPermission(TotalCaloriesBurnedRecord::class),
  HealthPermission.getWritePermission(TotalCaloriesBurnedRecord::class),
  HealthPermission.getReadPermission(StepsRecord::class),
  HealthPermission.getWritePermission(StepsRecord::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)
  }
}

از آنجا که کاربران می‌توانند در هر زمانی مجوزها را اعطا یا لغو کنند، برنامه شما باید هر بار قبل از استفاده، مجوزها را بررسی کند و سناریوهایی را که مجوز از دست می‌رود، مدیریت کند.

برای درخواست مجوزها، تابع checkPermissionsAndRun را فراخوانی کنید:

if (!granted.containsAll(PERMISSIONS)) {
    requestPermissions.launch(PERMISSIONS)
    // Check if required permissions are not granted, and return
  }
// Permissions already granted; proceed with inserting or reading data

اگر فقط نیاز به درخواست مجوز برای یک نوع داده واحد، مانند ضربان قلب، دارید، فقط آن نوع داده را در مجموعه مجوزهای خود قرار دهید:

دسترسی به ضربان قلب توسط مجوزهای زیر محافظت می‌شود:

  • android.permission.health.READ_HEART_RATE
  • android.permission.health.WRITE_HEART_RATE

برای افزودن قابلیت ضربان قلب به برنامه خود، با درخواست مجوز برای نوع داده HeartRateRecord شروع کنید.

برای نوشتن ضربان قلب، باید مجوز زیر را اعلام کنید:

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

برای خواندن ضربان قلب، باید مجوزهای زیر را درخواست کنید:

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

اجرای یک جلسه تمرینی

این بخش، گردش کار پیشنهادی برای ثبت داده‌های تمرین را شرح می‌دهد.

شروع جلسه

برای ایجاد یک تمرین جدید:

  1. یک شناسه جلسه منحصر به فرد ایجاد کنید: تأیید کنید که این شناسه پایدار است. اگر فرآیند برنامه شما متوقف و مجدداً راه اندازی شود، باید بتوانید با استفاده از همان شناسه از سر بگیرید تا از جلسات پراکنده جلوگیری شود.
  2. برای جلوگیری از تکرار در هنگام تلاش‌های مجدد همگام‌سازی، یک metadata.clientRecordId تنظیم کنید.
  3. نوشتن یک ExerciseSessionRecord : زمان شروع را نیز در آن وارد کنید.
  4. شروع جمع‌آوری نوع داده و داده‌های GPS: این موارد را فقط پس از مقداردهی اولیه موفقیت‌آمیز رکورد جلسه شروع کنید.

مثال:

val sessionId = UUID.randomUUID().toString()
val sessionClientId = UUID.randomUUID().toString()

val session = ExerciseSessionRecord(
    id = sessionId,
    exerciseType = ExerciseType.EXERCISE_TYPE_RUNNING,
    startTime = Instant.now(),
    endTime = null,
    metadata = Metadata(clientRecordId = sessionClientId),
)

healthConnectClient.insertRecords(listOf(session))

مسیرهای ورزشی را ثبت کنید

برای کسب اطلاعات بیشتر در مورد راهنمای خواندن، به بخش «خواندن داده‌های خام» مراجعه کنید.

هنگام ثبت یک مسیر ورزشی، باید داده‌های خود را دسته‌بندی کنید. این یعنی به جای ذخیره تک تک نقاط GPS به صورت جداگانه، گروهی از نقاط را جمع‌آوری کرده و همه آنها را به صورت یکجا در یک فراخوانی ذخیره می‌کنید.

این مهم است زیرا هر بار که برنامه شما Health Connect را می‌خواند یا می‌نویسد، از مقدار کمی باتری و قدرت پردازش استفاده می‌کند.

کد زیر نحوه ضبط دسته‌ای را نشان می‌دهد:

// 1. Create a list to hold your route locations
val routeLocations = mutableListOf<ExerciseRoute.Location>()

// 2. Add points to your list as the exercise happens
routeLocations.add(
    ExerciseRoute.Location(
        time = Instant.now(),
        latitude = 37.7749,
        longitude = -122.4194
    )
)

// ... keep adding points over a period of time ...

// 3. Save the whole list at once (Batching)
val session = ExerciseSessionRecord(
    startTime = startTime,
    endTime = endTime,
    exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_RUNNING,
    // We pass the whole list here
    exerciseRoute = ExerciseRoute(routeLocations)
)

healthConnectClient.insertRecords(listOf(session))

پایان دادن به یک جلسه

پس از توقف جمع‌آوری داده‌ها:

  • به‌روزرسانی رکورد: برنامه‌ی شما ExerciseSessionRecord را با یک endTime به‌روزرسانی می‌کند.
  • نهایی کردن داده‌ها: در صورت تمایل، مقادیر خلاصه (مانند کل مسافت یا میانگین سرعت) را محاسبه کرده و آنها را به عنوان رکوردهای اضافی بنویسید.
val finishedSession = session.copy(endTime = Instant.now())
healthConnectClient.updateRecords(listOf(finishedSession))

خواندن داده‌های تمرین

برنامه‌ها می‌توانند جلسات ورزشی و داده‌های مرتبط با آنها را بخوانند تا فعالیت را خلاصه کنند، بینش‌های سلامتی ارائه دهند یا داده‌ها را با یک سرور خارجی همگام‌سازی کنند. به عنوان مثال، می‌توانید یک ExerciseSessionRecord بخوانید و سپس HeartRateRecord یا DistanceRecord را که در همان بازه زمانی رخ داده است، جستجو کنید.

اگر نیاز دارید داده‌های تمرین را با یک سرور پشتیبان همگام‌سازی کنید، یا پایگاه داده برنامه خود را با Health Connect به‌روز نگه دارید، از ChangeLogs استفاده کنید. این به شما امکان می‌دهد لیستی از رکوردهای درج شده، به‌روزرسانی شده یا حذف شده را از یک نقطه زمانی خاص بازیابی کنید، که کارآمدتر از ردیابی دستی تغییرات یا خواندن مکرر همه داده‌ها است. برای اطلاعات بیشتر، به همگام‌سازی داده‌ها با Health Connect مراجعه کنید.

جلسات را بخوانید

برای خواندن جلسات تمرین، از ReadRecordsRequest با نوع ExerciseSessionRecord استفاده کنید. معمولاً این مورد را بر اساس یک محدوده زمانی خاص فیلتر می‌کنید.

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

    for (exerciseRecord in response.records) {
        // Process each session
        val exerciseType = exerciseRecord.exerciseType
        val notes = exerciseRecord.notes
    }
}

مسیرها را بخوانید

اگرچه داده‌های ExerciseRoute به عنوان بخشی از یک جلسه تمرین نوشته می‌شوند، اما باید جداگانه خوانده شوند. برای خواندن داده‌های مسیر آن، از متد getExerciseRoute() به همراه شناسه جلسه استفاده کنید:

suspend fun readExerciseRoute(
    healthConnectClient: HealthConnectClient,
    exerciseSessionRecord: ExerciseSessionRecord
) {
    // Check if the session has a route
    val route = healthConnectClient.getExerciseRoute(
        exerciseSessionRecordId = exerciseSessionRecord.metadata.id
    )

    when (route) {
        is ExerciseRouteResponse.Success -> {
            val locations = route.exerciseRoute.locations
            for (location in locations) {
                // Use latitude, longitude, and altitude
            }
        }
        is ExerciseRouteResponse.NoData -> {
            // Handle case where no route exists
        }
        is ExerciseRouteResponse.ConsentRequired -> {
            // Handle case where permissions are missing
        }
    }
}

خواندن انواع داده

برای خواندن داده‌های جزئی خاص (مانند ضربان قلب) که در طول یک جلسه رخ داده است، startTime و endTime جلسه برای فیلتر کردن درخواست برای آن نوع داده استفاده کنید.

suspend fun readHeartRateData(
    healthConnectClient: HealthConnectClient,
    exerciseSession: ExerciseSessionRecord
) {
    val response = healthConnectClient.readRecords(
        ReadRecordsRequest(
            recordType = HeartRateRecord::class,
            timeRangeFilter = TimeRangeFilter.between(
                exerciseSession.startTime,
                exerciseSession.endTime
            )
        )
    )

    for (heartRateRecord in response.records) {
        for (sample in heartRateRecord.samples) {
            val bpm = sample.beatsPerMinute
        }
    }
}

بهترین شیوه‌ها

برای بهبود قابلیت اطمینان داده‌ها و تجربه کاربری، این دستورالعمل‌ها را دنبال کنید:

  • فرکانس نوشتن
    • ردیابی فعال (پیش‌زمینه): برای تمرینات فعال، داده‌ها را به محض در دسترس قرار گرفتن یا حداکثر با فاصله ۱۵ دقیقه بنویسید.
    • همگام‌سازی پس‌زمینه: از WorkManager برای نوشتن‌های معوق استفاده کنید. برای ایجاد تعادل بین داده‌های بلادرنگ و بهره‌وری باتری، یک فاصله ۱۵ دقیقه‌ای را در نظر بگیرید.
    • دسته‌بندی: هر رویداد حسگر را به صورت جداگانه ننویسید. درخواست‌های خود را به بخش‌های کوچک‌تر تقسیم کنید. Health Connect در هر درخواست نوشتن، تا ۱۰۰۰ رکورد را مدیریت می‌کند.
  • شناسه‌های جلسه را ثابت و منحصر به فرد نگه دارید: از شناسه‌های ثابت برای جلسات خود استفاده کنید. اگر یک جلسه ویرایش یا به‌روزرسانی شود، استفاده از شناسه یکسان مانع از آن می‌شود که به عنوان یک تمرین جدید و جداگانه در نظر گرفته شود.
  • از دسته‌بندی برای انواع داده‌ها و نقاط مسیر استفاده کنید: برای کاهش سربار ورودی/خروجی و حفظ عمر باتری، نقاط داده خود را در یک فراخوانی insertRecords گروه‌بندی کنید، نه اینکه هر نقطه را جداگانه بنویسید.
  • از نوشتن داده‌های تکراری خودداری کنید: از شناسه‌های کلاینت استفاده کنید. هنگام ایجاد رکوردها، یک 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"
        )
    )
    
  • بررسی داده‌های موجود: قبل از همگام‌سازی، محدوده زمانی را بررسی کنید تا ببینید آیا رکوردهایی از برنامه شما از قبل وجود دارند یا خیر.

  • اعتبارسنجی دقت GPS: قبل از نوشتن در ExerciseRoute نمونه‌های GPS با دقت پایین (مثلاً نقاطی با شعاع دقت افقی بالا) را فیلتر کنید تا از تمیز و حرفه‌ای بودن نقشه اطمینان حاصل شود.

  • اطمینان حاصل کنید که مهرهای زمانی همپوشانی ندارند: تأیید کنید که یک جلسه جدید قبل از پایان جلسه قبلی شروع نشود. جلسات همپوشانی می‌توانند باعث ایجاد تداخل در داشبوردهای تناسب اندام و محاسبات خلاصه شوند.

  • دلایل منطقی و واضحی برای مجوز ارائه دهید: از جریان Permission.createIntent برای توضیح اینکه چرا برنامه شما به دسترسی به داده‌های سلامت نیاز دارد، مانند «برای نقشه‌برداری از دویدن‌های شما و محاسبه کالری سوزانده شده» استفاده کنید.

  • پشتیبانی از مکث و از سرگیری: بررسی کنید که برنامه شما مکث‌ها را به درستی مدیریت می‌کند. وقتی کاربر مکث می‌کند، جمع‌آوری نقاط مسیر و انواع داده‌ها را متوقف کنید تا میانگین سرعت و مدت زمان دقیق باقی بماند.

  • تست جلسات طولانی مدت: مصرف باتری را در طول جلساتی که چند ساعت طول می‌کشند، زیر نظر داشته باشید تا مطمئن شوید که فاصله زمانی بین جلسات و استفاده از حسگر، دستگاه را تخلیه نمی‌کند.

  • هماهنگ کردن مهرهای زمانی با نرخ حسگرها: مهرهای زمانی رکورد خود را با فرکانس واقعی حسگرهایتان (مثلاً ۱ هرتز برای GPS) مطابقت دهید تا داده‌ها با دقت بالا حفظ شوند.

آزمایش

برای تأیید صحت داده‌ها و یک تجربه کاربری با کیفیت بالا، این استراتژی‌های آزمایش را دنبال کنید و به مستندات رسمی موارد استفاده برتر Test مراجعه کنید.

ابزارهای تأیید

  • جعبه ابزار Health Connect : از این برنامه همراه برای بررسی دستی رکوردها، حذف داده‌های آزمایشی و شبیه‌سازی تغییرات در پایگاه داده استفاده کنید. این بهترین راه برای تأیید صحت ذخیره رکوردهای شما است.
  • تست واحد با FakeHealthConnectClient : از کتابخانه تست برای تأیید نحوه مدیریت موارد خاص توسط برنامه شما، مانند لغو مجوز یا استثنائات API، بدون نیاز به دستگاه فیزیکی استفاده کنید.

چک لیست کیفیت

معماری معمولی

اجرای یک تمرین معمولاً شامل موارد زیر است:

کامپوننت مدیریت می‌کند
کنترل‌کننده جلسه حالت جلسه
تایمر
منطق دسته بندی
کنترل‌کننده‌های انواع داده
نمونه‌برداری مکانی
لایه مخزن (عملیات Health Connect را در بر می‌گیرد :) جلسه را وارد کنید
درج انواع داده
نقاط مسیر را درج می‌کند
خلاصه جلسات را بخوانید
لایه رابط کاربری (نمایشگرها): مدت زمان
انواع داده‌های زنده
پیش‌نمایش نقشه
محاسبات تقسیم شده
ردیابی زنده GPS

عیب‌یابی

علامت علت احتمالی وضوح تصویر
مسیر با جلسه مرتبط نیست عدم تطابق شناسه جلسه یا محدوده زمانی. تأیید کنید که ExerciseRoute با محدوده زمانی نوشته شده است که کاملاً در مدت زمان ExerciseSessionRecord قرار می‌گیرد. اگر بعداً به جلسه ارجاع می‌دهید، تأیید کنید که از شناسه‌های سازگار استفاده می‌کنید. به بخش ضبط مسیرهای تمرین مراجعه کنید.
انواع داده‌ی ناموجود (برای مثال، ضربان قلب) مجوزهای نوشتن وجود ندارد یا فیلترهای زمانی نادرست هستند. بررسی کنید که درخواست داده‌اید و کاربر مجوز نوع داده‌ی خاص را اعطا کرده است. تأیید کنید که ReadRecordsRequest شما از TimeRangeFilter استفاده می‌کند که با جلسه مطابقت دارد. به Permissions مراجعه کنید.
نوشتن در جلسه با شکست مواجه می‌شود مهرهای زمانی همپوشانی دارند. Health Connect ممکن است رکوردهایی را که با داده‌های موجود از همان برنامه همپوشانی دارند، رد کند. تأیید کنید که startTime یک جلسه جدید بعد از endTime جلسه قبلی باشد.
هیچ داده GPS ثبت نشده است سرویس پیش‌زمینه از کار افتاده یا غیرفعال بود. برای جمع‌آوری داده‌ها در حالی که صفحه نمایش خاموش است، باید از یک سرویس پیش‌زمینه با ویژگی foregroundServiceType="health" یا location استفاده کنید.
رکوردهای تکراری ظاهر می‌شوند شناسه clientRecordId موجود نیست یک clientRecordId منحصر به فرد در Metadata هر رکورد اختصاص دهید. این به Health Connect اجازه می‌دهد تا در صورت نوشتن دو بار داده‌های مشابه در طول تلاش مجدد همگام‌سازی، حذف داده‌های تکراری را انجام دهد. به بهترین شیوه‌ها مراجعه کنید.

مراحل اشکال‌زدایی رایج

  • بررسی وضعیت مجوزها: همیشه قبل از اقدام به عملیات خواندن یا نوشتن، تابع getPermissionStatus() را فراخوانی کنید. کاربران می‌توانند در هر زمانی مجوزها را در تنظیمات سیستم لغو کنند.
  • حالت اجرا را تأیید کنید: اگر برنامه شما در پس‌زمینه داده‌ها را جمع‌آوری نمی‌کند، تأیید کنید که مجوزهای صحیح را در AndroidManifest.xml خود اعلام کرده‌اید و کاربر برنامه را در حالت "Battery Restricted" قرار نداده است.