พัฒนาประสบการณ์การออกกำลังกายด้วย Health Connect

หากต้องการสร้างประสบการณ์การออกกำลังกายในแอป คุณสามารถใช้ Health Connect เพื่อทำสิ่งต่างๆ เช่น

  • เขียนข้อมูลเซสชันการออกกำลังกาย
  • เขียนเส้นทางการออกกำลังกาย
  • เขียนเมตริกการออกกำลังกาย เช่น อัตราการเต้นของหัวใจ ความเร็ว และระยะทาง
  • อ่านข้อมูลการออกกำลังกายจากแอปอื่นๆ

คู่มือนี้อธิบายวิธีสร้างฟีเจอร์การออกกำลังกายเหล่านี้ โดยครอบคลุมประเภทข้อมูล การดำเนินการในเบื้องหลัง สิทธิ์ เวิร์กโฟลว์ที่แนะนำ และแนวทางปฏิบัติแนะนำ

ภาพรวม: การสร้างเครื่องมือติดตามการออกกำลังกายที่ครอบคลุม

คุณสร้างประสบการณ์การติดตามการออกกำลังกายที่ครอบคลุมได้โดยใช้ Health Connect โดยทำตามขั้นตอนหลักต่อไปนี้

  • การใช้สิทธิ์อย่างถูกต้องตามสิทธิ์ด้านสุขภาพ
  • การบันทึกเซสชันโดยใช้ ExerciseSessionRecord
  • เขียนข้อมูลการออกกำลังกายอย่างสม่ำเสมอในระหว่างเซสชัน
  • จัดการการดำเนินการในเบื้องหลังอย่างเหมาะสมเพื่อยืนยันการบันทึกข้อมูลอย่างต่อเนื่อง
  • อ่านข้อมูลเซสชันเพื่อดูสรุปและการวิเคราะห์หลังการออกกำลังกาย

เวิร์กโฟลว์นี้ช่วยให้ทำงานร่วมกับแอป Health Connect อื่นๆ ได้และยืนยันการเข้าถึงข้อมูลที่ผู้ใช้ควบคุม

ก่อนเริ่มต้น

ก่อนที่จะใช้ฟีเจอร์การออกกำลังกาย ให้ทำดังนี้

หัวข้อสำคัญ

Health Connect แสดงข้อมูลการออกกำลังกายโดยใช้คอมโพเนนต์หลัก 2-3 รายการ 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 สำหรับการเขียนหรือการซิงค์ที่เลื่อนออกไป
  • กลยุทธ์การรวมสำหรับการเขียนบันทึกปกติ

รักษาความต่อเนื่องโดยคง ID เซสชันให้สอดคล้องกันในการเขียนทั้งหมด

สิทธิ์

แอปของคุณต้องขอสิทธิ์ที่เกี่ยวข้องของ Health Connect ก่อนที่จะอ่านหรือเขียนข้อมูลการออกกำลังกาย สิทธิ์ทั่วไปสำหรับการออกกำลังกาย รวมถึงเซสชันการออกกำลังกาย เส้นทางการออกกำลังกาย และเมตริกต่างๆ เช่น อัตราการเต้นของหัวใจหรือ ความเร็ว ซึ่งประกอบด้วย

  • เซสชันการออกกำลังกาย: สิทธิ์อ่านและเขียนสำหรับ ExerciseSessionRecord
  • เส้นทางการออกกำลังกาย: สิทธิ์อ่านและเขียนสำหรับ ExerciseRoute
  • อัตราการเต้นของหัวใจ: สิทธิ์ในการอ่านและเขียนสำหรับ HeartRateRecord
  • ความเร็ว: สิทธิ์อ่านและเขียนสำหรับ SpeedRecord
  • ระยะทาง: สิทธิ์อ่านและเขียนสำหรับ DistanceRecord
  • แคลอรี: สิทธิ์อ่านและเขียนสำหรับ TotalCaloriesBurnedRecord
  • ความสูงที่สะสมได้: สิทธิ์ในการอ่านและเขียนสำหรับ ElevationGainedRecord
  • จังหวะการก้าว: สิทธิ์อ่านและเขียนสำหรับ StepsCadenceRecord
  • Power: สิทธิ์อ่านและเขียนสำหรับ PowerRecord
  • ขั้นตอน: สิทธิ์อ่านและเขียนสำหรับ StepsRecord

ตัวอย่างต่อไปนี้แสดงวิธีขอสิทธิ์หลายรายการสำหรับ เซสชันการออกกำลังกายที่มีข้อมูลเส้นทาง อัตราการเต้นของหัวใจ ระยะทาง แคลอรี่ ความเร็ว และจำนวนก้าว

หลังจากสร้างอินสแตนซ์ไคลเอ็นต์แล้ว แอปของคุณต้องขอสิทธิ์จากผู้ใช้ ผู้ใช้ต้องได้รับอนุญาตให้ให้สิทธิ์หรือปฏิเสธสิทธิ์ได้ทุกเมื่อ

โดยให้สร้างชุดสิทธิ์สำหรับประเภทข้อมูลที่จำเป็น ตรวจสอบว่าได้ประกาศสิทธิ์ในชุดไว้ในไฟล์ Manifest ของ Android ก่อน

// 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 ที่เกิดขึ้นในช่วงเวลาเดียวกันนั้น

หากต้องการซิงค์ข้อมูลการออกกำลังกายกับเซิร์ฟเวอร์แบ็กเอนด์ หรืออัปเดต Datastore ของแอปให้เป็นเวอร์ชันล่าสุดด้วย 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
        }
    }
}

แนวทางปฏิบัติแนะนำ

โปรดทำตามหลักเกณฑ์ต่อไปนี้เพื่อปรับปรุงความน่าเชื่อถือของข้อมูลและประสบการณ์ของผู้ใช้

  • ความถี่ในการเขียน
    • การติดตามที่ใช้งานอยู่(เบื้องหน้า): สำหรับการออกกำลังกายที่ใช้งานอยู่ ให้เขียนข้อมูลเมื่อพร้อมใช้งานหรือที่ช่วงเวลาสูงสุด 15 นาที
    • การซิงค์ในเบื้องหลัง: ใช้ WorkManager สำหรับการเขียนที่เลื่อนออกไป ตั้งช่วงเวลา 15 นาทีเพื่อสร้างสมดุลระหว่างข้อมูลแบบเรียลไทม์และประสิทธิภาพแบตเตอรี่
    • การจัดกลุ่ม: อย่าเขียนเหตุการณ์เซ็นเซอร์แต่ละรายการแยกกัน แบ่ง คำขอของคุณ Health Connect จัดการบันทึกได้สูงสุด 1,000 รายการต่อคำขอเขียน
  • รักษารหัสเซสชันให้คงที่และไม่ซ้ำกัน: ใช้ตัวระบุที่สอดคล้องกันสำหรับเซสชัน หากมีการแก้ไขหรืออัปเดตเซสชัน การใช้รหัสเดียวกันจะช่วยป้องกันไม่ให้ระบบถือว่าเซสชันนั้นเป็นเซสชันการออกกำลังกายใหม่ที่แยกต่างหาก
  • ใช้การจัดกลุ่มสำหรับทั้งประเภทข้อมูลและจุดเส้นทาง: หากต้องการลดค่าใช้จ่ายอินพุต/เอาต์พุตและรักษาอายุการใช้งานแบตเตอรี่ ให้จัดกลุ่มจุดข้อมูลเป็นคำสั่งเรียก 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: กรองตัวอย่าง GPS ที่มีความแม่นยำต่ำ (เช่น จุดที่มีรัศมีความแม่นยำในแนวนอนสูง) ก่อนที่จะเขียนไปยัง ExerciseRoute เพื่อตรวจสอบว่าแผนที่ดูสะอาดและเป็นมืออาชีพ

  • ตรวจสอบว่าการประทับเวลาไม่ทับซ้อนกัน: ตรวจสอบว่าเซสชันใหม่ไม่ได้ เริ่มก่อนที่เซสชันก่อนหน้าจะสิ้นสุด เซสชันที่ทับซ้อนกันอาจทำให้เกิดความขัดแย้ง ในแดชบอร์ดฟิตเนสและการคำนวณข้อมูลสรุป

  • ระบุเหตุผลที่ชัดเจนสำหรับสิทธิ์: ใช้โฟลว์ Permission.createIntent เพื่ออธิบายเหตุผลที่แอปของคุณต้องเข้าถึงข้อมูลสุขภาพ เช่น "เพื่อทำแผนที่การวิ่งและคำนวณแคลอรี่ที่ใช้ไป"

  • รองรับการหยุดชั่วคราวและเล่นต่อ: ยืนยันว่าแอปจัดการการหยุดชั่วคราวได้อย่างถูกต้อง เมื่อผู้ใช้หยุดชั่วคราว ให้หยุดรวบรวมจุดเส้นทางและประเภทข้อมูลเพื่อให้ อัตราการก้าวและระยะเวลาเฉลี่ยยังคงถูกต้อง

  • ทดสอบเซสชันที่ทำงานเป็นเวลานาน: ตรวจสอบการใช้แบตเตอรี่ระหว่างเซสชันที่ใช้เวลาหลายชั่วโมงเพื่อยืนยันช่วงการจัดกลุ่มและการใช้เซ็นเซอร์ว่า ไม่ทำให้แบตเตอรี่ของอุปกรณ์หมดเร็ว

  • จัดแนวการประทับเวลาให้ตรงกับอัตราเซ็นเซอร์: จับคู่การประทับเวลาของบันทึกกับความถี่จริงของเซ็นเซอร์ (เช่น 1Hz สำหรับ GPS) เพื่อรักษาความเที่ยงตรงสูงของข้อมูล

การทดสอบ

โปรดทำตามกลยุทธ์การทดสอบเหล่านี้และดูเอกสารประกอบทดสอบกรณีการใช้งานยอดนิยมอย่างเป็นทางการเพื่อยืนยันความถูกต้องของข้อมูลและประสบการณ์การใช้งานคุณภาพสูง

เครื่องมือยืนยัน

  • กล่องเครื่องมือ Health Connect: ใช้แอปคู่หูนี้เพื่อตรวจสอบระเบียนด้วยตนเอง ลบข้อมูลทดสอบ และจำลองการเปลี่ยนแปลงในฐานข้อมูล ซึ่งเป็น วิธีที่ดีที่สุดในการยืนยันว่าระบบจัดเก็บระเบียนของคุณอย่างถูกต้อง
  • การทำ Unit Test ด้วย FakeHealthConnectClient: ใช้ไลบรารีการทดสอบ เพื่อยืนยันวิธีที่แอปจัดการกรณีขอบ เช่น การเพิกถอนสิทธิ์หรือข้อยกเว้น API โดยไม่ต้องใช้อุปกรณ์จริง

รายการตรวจสอบคุณภาพ

สถาปัตยกรรมทั่วไป

การใช้งานการออกกำลังกายมักประกอบด้วย

ส่วนประกอบ จัดการ
ตัวควบคุมเซสชัน สถานะเซสชัน
ตัวจับเวลา
ตรรกะการจัดกลุ่ม
ตัวควบคุมประเภทข้อมูล
การสุ่มตัวอย่างตำแหน่ง
เลเยอร์ที่เก็บ (ครอบคลุมการดำเนินการของ Health Connect) แทรกเซสชัน
แทรกประเภทข้อมูล
แทรกจุดเส้นทาง
อ่านข้อมูลสรุปเซสชัน
เลเยอร์ UI (การแสดงผล): ระยะเวลา
ประเภทข้อมูลสด
ตัวอย่างแผนที่
การคำนวณการแยก
การติดตาม GPS แบบเรียลไทม์

การแก้ปัญหา

ลักษณะปัญหา สาเหตุที่เป็นไปได้ ความละเอียด
เส้นทางไม่ได้เชื่อมโยงกับเซสชัน รหัสเซสชันหรือช่วงเวลาไม่ตรงกัน ตรวจสอบว่า ExerciseRoute มีช่วงเวลาที่อยู่ภายในระยะเวลาของ ExerciseSessionRecord ทั้งหมด ยืนยันว่าคุณใช้รหัสที่สอดคล้องกันหากอ้างอิงเซสชันในภายหลัง ดูการบันทึกเส้นทางการออกกำลังกาย
ประเภทข้อมูลที่ขาดหายไป (เช่น อัตราการเต้นของหัวใจ) ไม่มีสิทธิ์เขียนหรือตัวกรองเวลาไม่ถูกต้อง ตรวจสอบว่าคุณได้ขอและผู้ใช้ได้ให้สิทธิ์ประเภทข้อมูลที่เฉพาะเจาะจงแล้ว ตรวจสอบว่า ReadRecordsRequest ใช้ TimeRangeFilter ที่ตรงกับเซสชัน ดูสิทธิ์
เซสชันเขียนไม่สำเร็จ การประทับเวลาที่ทับซ้อนกัน Health Connect อาจปฏิเสธบันทึกที่ทับซ้อนกับข้อมูลที่มีอยู่จากแอปเดียวกัน ตรวจสอบว่าstartTimeของเซสชันใหม่เกิดขึ้นหลังจากendTimeของเซสชันก่อนหน้า
ไม่มีการบันทึกข้อมูล GPS บริการที่ทำงานอยู่เบื้องหน้าถูกหยุดทำงานหรือไม่ทำงาน หากต้องการรวบรวมข้อมูลขณะปิดหน้าจอ คุณต้องใช้บริการที่ทำงานอยู่เบื้องหน้าที่มีแอตทริบิวต์ foregroundServiceType="health" หรือตำแหน่ง
ระเบียนที่ซ้ำกันปรากฏขึ้น ไม่มี clientRecordId กำหนด clientRecordId ที่ไม่ซ้ำกันใน Metadata ของแต่ละระเบียน ซึ่งจะช่วยให้ Health Connect สามารถขจัดข้อมูลที่ซ้ำกันได้หากมีการเขียนข้อมูลเดียวกัน 2 ครั้งระหว่างการลองซิงค์อีกครั้ง ดูแนวทางปฏิบัติแนะนำ

ขั้นตอนการแก้ไขข้อบกพร่องที่พบบ่อย

ตรวจสอบสถานะสิทธิ์ โปรดเรียกใช้ getPermissionStatus() เสมอก่อนที่จะพยายามดำเนินการอ่านหรือเขียน ผู้ใช้สามารถเพิกถอนสิทธิ์ในการตั้งค่าระบบได้ทุกเมื่อ
ตรวจสอบโหมดการดำเนินการ หากแอปไม่ได้รวบรวมข้อมูลในเบื้องหลัง ให้ตรวจสอบว่าคุณได้ประกาศสิทธิ์ที่ถูกต้องในไฟล์ AndroidManifest.xml และผู้ใช้ไม่ได้ตั้งค่าแอปเป็นโหมด "จำกัดแบตเตอรี่"