หากต้องการสร้างประสบการณ์การออกกำลังกายในแอป คุณสามารถใช้ Health Connect เพื่อทำสิ่งต่างๆ เช่น
- เขียนข้อมูลเซสชันการออกกำลังกาย
- เขียนเส้นทางการออกกำลังกาย
- เขียนเมตริกการออกกำลังกาย เช่น อัตราการเต้นของหัวใจ ความเร็ว และระยะทาง
- อ่านข้อมูลการออกกำลังกายจากแอปอื่นๆ
คู่มือนี้อธิบายวิธีสร้างฟีเจอร์การออกกำลังกายเหล่านี้ โดยครอบคลุมประเภทข้อมูล การดำเนินการในเบื้องหลัง สิทธิ์ เวิร์กโฟลว์ที่แนะนำ และแนวทางปฏิบัติแนะนำ
ภาพรวม: การสร้างเครื่องมือติดตามการออกกำลังกายที่ครอบคลุม
คุณสร้างประสบการณ์การติดตามการออกกำลังกายที่ครอบคลุมได้โดยใช้ Health Connect โดยทำตามขั้นตอนหลักต่อไปนี้
- การใช้สิทธิ์อย่างถูกต้องตามสิทธิ์ด้านสุขภาพ
- การบันทึกเซสชันโดยใช้
ExerciseSessionRecord - เขียนข้อมูลการออกกำลังกายอย่างสม่ำเสมอในระหว่างเซสชัน
- จัดการการดำเนินการในเบื้องหลังอย่างเหมาะสมเพื่อยืนยันการบันทึกข้อมูลอย่างต่อเนื่อง
- อ่านข้อมูลเซสชันเพื่อดูสรุปและการวิเคราะห์หลังการออกกำลังกาย
เวิร์กโฟลว์นี้ช่วยให้ทำงานร่วมกับแอป Health Connect อื่นๆ ได้และยืนยันการเข้าถึงข้อมูลที่ผู้ใช้ควบคุม
ก่อนเริ่มต้น
ก่อนที่จะใช้ฟีเจอร์การออกกำลังกาย ให้ทำดังนี้
- ผสานรวม Health Connect โดยใช้ทรัพยากร Dependency ที่เหมาะสม
- สร้างอินสแตนซ์
HealthConnectClient - ยืนยันว่าแอปของคุณใช้ขั้นตอนการให้สิทธิ์รันไทม์ตามสิทธิ์ด้านสุขภาพ
- หากเวิร์กโฟลว์ใช้ GPS ให้ตั้งค่าสิทธิ์เข้าถึงตำแหน่งและบริการที่ทำงานอยู่เบื้องหน้า
หัวข้อสำคัญ
Health Connect แสดงข้อมูลการออกกำลังกายโดยใช้คอมโพเนนต์หลัก 2-3 รายการ ExerciseSessionRecordทำหน้าที่เป็นบันทึกส่วนกลางสำหรับการออกกำลังกาย
ซึ่งมีรายละเอียดต่างๆ เช่น เวลาเริ่มต้นหรือสิ้นสุด และประเภทการออกกำลังกาย ในระหว่างเซสชัน ระบบจะบันทึกข้อมูลประเภทต่างๆ เช่น HeartRateRecord หรือ SpeedRecord ได้ สำหรับกิจกรรมกลางแจ้ง ExerciseRoute จะจัดเก็บข้อมูล GPS ซึ่ง
ลิงก์กับเซสชันที่เกี่ยวข้อง
เซสชันการออกกำลังกาย
ExerciseSessionRecord คือบันทึกส่วนกลางสำหรับข้อมูลการออกกำลังกาย ซึ่งแสดงถึงเซสชันการออกกำลังกายเดียว
แต่ละระเบียนจะจัดเก็บข้อมูลต่อไปนี้
startTimeendTimeexerciseType- ข้อมูลเมตาของเซสชันที่ไม่บังคับ (ชื่อ หมายเหตุ)
นอกจากนี้ 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_RATEandroid.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>
ใช้เซสชันการออกกำลังกาย
ส่วนนี้อธิบายเวิร์กโฟลว์ที่แนะนำสำหรับการบันทึกข้อมูลการออกกำลังกาย
เริ่มเซสชัน
วิธีสร้างการออกกำลังกายใหม่
- สร้างรหัสเซสชันที่ไม่ซ้ำกัน: ยืนยันว่ารหัสนี้มีความเสถียร หากกระบวนการของแอปถูกปิดและรีสตาร์ท คุณต้องสามารถใช้รหัสเดิมต่อเพื่อป้องกันเซสชันที่กระจัดกระจาย
- ตั้งค่า
metadata.clientRecordIdเพื่อป้องกันไม่ให้มีรายการซ้ำกันระหว่างการลองซิงค์ใหม่ - เขียน
ExerciseSessionRecord: ระบุเวลาเริ่มต้น - เริ่มรวบรวมข้อมูลประเภทข้อมูลและ 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.clientRecordIdHealth 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 และผู้ใช้ไม่ได้ตั้งค่าแอปเป็นโหมด "จำกัดแบตเตอรี่" |