หากต้องการสร้างประสบการณ์การออกกำลังกายในแอป คุณสามารถใช้ 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
ตัวอย่างต่อไปนี้แสดงวิธีขอสิทธิ์หลายรายการสำหรับ เซสชันการออกกำลังกายที่มีข้อมูลเส้นทาง อัตราการเต้นของหัวใจ ระยะทาง แคลอรี่ ความเร็ว และจำนวนก้าว
หลังจากสร้างอินสแตนซ์ไคลเอ็นต์แล้ว แอปของคุณต้องขอสิทธิ์จากผู้ใช้ ผู้ใช้ต้องได้รับอนุญาตให้ให้หรือปฏิเสธสิทธิ์ได้ทุกเมื่อ โดยให้สร้างชุดสิทธิ์สำหรับประเภทข้อมูลที่จำเป็น ตรวจสอบว่าได้ประกาศสิทธิ์ในชุดดังกล่าวใน Android manifest ก่อน
val permissions = setOf( HealthPermission.getReadPermission(ExerciseSessionRecord::class), HealthPermission.getWritePermission(ExerciseSessionRecord::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
val permissions = setOf( HealthPermission.getReadPermission(StepsRecord::class), HealthPermission.getWritePermission(StepsRecord::class), HealthPermission.getReadPermission(HeartRateRecord::class), HealthPermission.getWritePermission(HeartRateRecord::class) ) val requestPermissionsLauncher = rememberLauncherForActivityResult( contract = PermissionController.createRequestPermissionResultContract() ) { grantedPermissions -> if (grantedPermissions.containsAll(permissions)) { coroutineScope.launch { snackbarHostState.showSnackbar("Permissions granted!") } } else { coroutineScope.launch { snackbarHostState.showSnackbar("Permissions denied.") } } }
หากต้องการขอสิทธิ์ ให้เรียกใช้ฟังก์ชัน checkPermissionsAndRun ดังนี้
if (!granted.containsAll(permissions)) { // Check if required permissions are not granted, and return return emptySet() } // 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 sessionClientId = UUID.randomUUID().toString() val zoneOffset = ZoneOffset.systemDefault().rules.getOffset(startTime) val session = ExerciseSessionRecord( startTime = startTime, startZoneOffset = zoneOffset, endTime = startTime.plusSeconds(3600), endZoneOffset = zoneOffset, exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_RUNNING, 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
}
}
}
แนวทางปฏิบัติแนะนำ
โปรดทำตามหลักเกณฑ์ต่อไปนี้เพื่อปรับปรุงความน่าเชื่อถือของข้อมูลและประสบการณ์ของผู้ใช้
- เขียนบ่อยๆ ระหว่างการติดตามที่ใช้งานอยู่: สำหรับการติดตามที่ใช้งานอยู่ ให้เขียนข้อมูลเมื่อพร้อมใช้งานหรือที่ช่วงเวลาสูงสุด 15 นาที
- ใช้ WorkManager สำหรับการซิงค์ในเบื้องหลัง: ใช้
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เพื่ออธิบายเหตุผลที่แอปของคุณต้องเข้าถึงข้อมูลสุขภาพ เช่น "เพื่อตรวจสอบแนวโน้มความดันโลหิตและให้ข้อมูลเชิงลึก" - รองรับการหยุดชั่วคราวและเล่นต่อ: ตรวจสอบว่าแอปจัดการการหยุดชั่วคราวได้อย่างถูกต้อง เมื่อผู้ใช้หยุดชั่วคราว ให้หยุดรวบรวมจุดเส้นทางและประเภทข้อมูลเพื่อให้ก้าวเฉลี่ยและระยะเวลาถูกต้อง
- ทดสอบเซสชันที่ทำงานเป็นเวลานาน: ตรวจสอบการใช้แบตเตอรี่ระหว่างเซสชันที่ใช้เวลาหลายชั่วโมงเพื่อยืนยันว่าช่วงการจัดกลุ่มและการใช้เซ็นเซอร์จะไม่ทำให้แบตเตอรี่ของอุปกรณ์หมดเร็ว
- จัดแนวการประทับเวลาให้ตรงกับอัตราเซ็นเซอร์: จับคู่การประทับเวลาของบันทึกกับความถี่จริงของเซ็นเซอร์เพื่อรักษาความเที่ยงตรงของข้อมูล
การทดสอบ
โปรดทำตามกลยุทธ์การทดสอบเหล่านี้และดูเอกสารประกอบทดสอบกรณีการใช้งานยอดนิยมอย่างเป็นทางการเพื่อยืนยันความถูกต้องของข้อมูลและประสบการณ์การใช้งานคุณภาพสูง
เครื่องมือยืนยัน
- กล่องเครื่องมือ 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 และผู้ใช้ไม่ได้ตั้งค่าแอปเป็นโหมด "จำกัดแบตเตอรี่" |