หากต้องการสร้างแอปที่จัดการค่าสัญญาณชีพของผู้ใช้ คุณสามารถใช้ Health Connect เพื่อทำสิ่งต่างๆ ได้ดังนี้
- อ่านข้อมูลสัญญาณชีพ เช่น ความดันโลหิต อัตราการเต้นของหัวใจ และอุณหภูมิร่างกายจากแอปอื่นๆ
- เขียนข้อมูลค่าสัญญาณชีพที่แอปหรืออุปกรณ์ที่เชื่อมต่อบันทึกไว้
- ตรวจสอบแนวโน้มและให้ข้อมูลเชิงลึกด้านสุขภาพโดยอิงตามข้อมูลสัญญาณชีพ
คู่มือนี้อธิบายวิธีใช้ข้อมูลค่าสัญญาณชีพ โดยครอบคลุมสิทธิ์ เวิร์กโฟลว์การอ่านและการเขียน รวมถึงแนวทางปฏิบัติแนะนำ
ภาพรวม: การสร้างเครื่องมือติดตามข้อมูลสัญญาณชีพที่ครอบคลุม
คุณสามารถสร้างประสบการณ์การติดตามค่าสัญญาณชีพที่ครอบคลุมโดยใช้ Health Connect ได้ด้วยการทำตามขั้นตอนหลักๆ ต่อไปนี้
- ขอสิทธิ์ที่เหมาะสมสำหรับประเภทข้อมูลค่าสัญญาณชีพ
- เขียนข้อมูลสัญญาณชีพโดยใช้บันทึกข้อมูล เช่น
BloodPressureRecord,HeartRateRecordและบันทึกข้อมูลสัญญาณชีพอื่นๆ - อ่านข้อมูลค่าสัญญาณชีพเพื่อแสดง วิเคราะห์ หรือการซิงค์
- ใช้การจัดกลุ่มเพื่อการเขียนและการอ่านข้อมูลที่มีประสิทธิภาพ
เวิร์กโฟลว์นี้ช่วยให้สามารถทำงานร่วมกับแอป Health Connect อื่นๆ ได้และยืนยันการเข้าถึงข้อมูลที่ผู้ใช้ควบคุม
ก่อนเริ่มต้น
สิ่งที่ควรทำก่อนติดตั้งใช้งานฟีเจอร์ค่าสัญญาณชีพ
- ผสานรวม Health Connect โดยใช้ทรัพยากร Dependency ที่เหมาะสม
- สร้างอินสแตนซ์
HealthConnectClient - ตรวจสอบว่าแอปของคุณใช้โฟลว์สิทธิ์รันไทม์ ตามสิทธิ์ด้านสุขภาพ
หัวข้อสำคัญ
ข้อมูลค่าสัญญาณชีพใน Health Connect แสดงด้วยบันทึกข้อมูลประเภทต่างๆ ซึ่งแต่ละประเภทจะสอดคล้องกับการวัดทางสรีรวิทยาที่เฉพาะเจาะจง ข้อมูลสัญญาณชีพมักจะบันทึกเป็นข้อมูล ณ จุดใดจุดหนึ่งหรือข้อมูลตามช่วงเวลา ซึ่งแตกต่างจากเซสชันการออกกำลังกาย
ประเภทข้อมูลค่าสัญญาณชีพ
ข้อมูลค่าสัญญาณชีพแสดงด้วยบันทึกข้อมูลแต่ละประเภท ประเภทที่พบบ่อย ได้แก่
BloodPressureRecord: แสดงค่าความดันโลหิตที่อ่านได้ครั้งเดียว ซึ่งรวมถึงความดันขณะหัวใจบีบและความดันขณะหัวใจคลายตัว รวมถึงท่าทางของร่างกายHeartRateRecord: แสดงการวัดอัตราการเต้นของหัวใจหลายครั้งRestingHeartRateRecord: แสดงการวัดอัตราการเต้นของหัวใจขณะพักครั้งเดียวBodyTemperatureRecord: แสดงค่าอุณหภูมิร่างกายที่อ่านได้ครั้งเดียว ซึ่งรวมถึงตำแหน่งที่วัดBloodGlucoseRecord: แสดงค่าน้ำตาลกลูโคสในเลือดที่อ่านได้ครั้งเดียว ซึ่งรวมถึงความสัมพันธ์กับมื้ออาหารและแหล่งที่มาของตัวอย่างOxygenSaturationRecord: แสดงค่าความอิ่มตัวของออกซิเจนในเลือดที่อ่านได้ครั้งเดียวRespiratoryRateRecord: แสดงการวัดอัตราการหายใจครั้งเดียว
ดูรายการประเภทข้อมูลทั้งหมดได้ที่ ประเภทข้อมูล Health Connect
ข้อควรพิจารณาในการพัฒนา
ข้อมูลค่าสัญญาณชีพอาจเป็นข้อมูลที่ละเอียดอ่อน และแอปอาจต้องเขียนข้อมูลเพื่อตอบสนองต่อการวัดจากเซ็นเซอร์หรือข้อมูลจากผู้ใช้ หรือซิงค์ข้อมูลจากแบ็กเอนด์ สิทธิ์จึงมีความสำคัญอย่างยิ่งในการจัดการข้อมูลสัญญาณชีพ
สิทธิ์
แอปของคุณต้องขอสิทธิ์ Health Connect ที่เกี่ยวข้องก่อนอ่านหรือเขียนข้อมูลค่าสัญญาณชีพ สิทธิ์ที่พบบ่อยสำหรับข้อมูลสัญญาณชีพ ได้แก่ ความดันโลหิต อัตราการเต้นของหัวใจ อุณหภูมิร่างกาย น้ำตาลกลูโคสในเลือด ความอิ่มตัวของออกซิเจน และอัตราการหายใจ ซึ่งประกอบด้วย
- ความดันโลหิต: สิทธิ์อ่านและเขียนสำหรับ
BloodPressureRecord - อัตราการเต้นของหัวใจ: สิทธิ์อ่านและเขียนสำหรับ
HeartRateRecord - อัตราการเต้นของหัวใจขณะพัก: สิทธิ์อ่านและเขียนสำหรับ
RestingHeartRateRecord - อุณหภูมิร่างกาย: สิทธิ์อ่านและเขียนสำหรับ
BodyTemperatureRecord - น้ำตาลกลูโคสในเลือด: สิทธิ์อ่านและเขียนสำหรับ
BloodGlucoseRecord - ความอิ่มตัวของออกซิเจน: สิทธิ์อ่านและเขียนสำหรับ
OxygenSaturationRecord - อัตราการหายใจ: สิทธิ์อ่านและเขียนสำหรับ
RespiratoryRateRecord
ตัวอย่างต่อไปนี้แสดงวิธีขอสิทธิ์สำหรับความดันโลหิต อัตราการเต้นของหัวใจ และอุณหภูมิร่างกาย
หลังจากสร้างอินสแตนซ์ไคลเอ็นต์แล้ว แอปของคุณต้องขอสิทธิ์จากผู้ใช้ ผู้ใช้ต้องได้รับอนุญาตให้ให้สิทธิ์หรือปฏิเสธสิทธิ์ได้ทุกเมื่อ
หากต้องการทำเช่นนั้น ให้สร้างชุดสิทธิ์สำหรับประเภทข้อมูลที่จำเป็น ตรวจสอบว่าได้ประกาศสิทธิ์ในชุดในไฟล์ Manifest ของ Android ก่อน
// Create a set of permissions for required data types
val PERMISSIONS =
setOf(
HealthPermission.getReadPermission(BloodPressureRecord::class),
HealthPermission.getWritePermission(BloodPressureRecord::class),
HealthPermission.getReadPermission(HeartRateRecord::class),
HealthPermission.getWritePermission(HeartRateRecord::class),
HealthPermission.getReadPermission(BodyTemperatureRecord::class),
HealthPermission.getWritePermission(BodyTemperatureRecord::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_BLOOD_PRESSUREandroid.permission.health.WRITE_BLOOD_PRESSURE
หากต้องการเพิ่มความสามารถในการจัดการความดันโลหิตลงในแอป ให้เริ่มต้นด้วยการขอสิทธิ์สำหรับข้อมูลประเภท BloodPressureRecord
นี่คือสิทธิ์ที่คุณต้องประกาศเพื่อให้สามารถเขียนข้อมูลความดันโลหิตได้
<application>
<uses-permission
android:name="android.permission.health.WRITE_BLOOD_PRESSURE" />
...
</application>
หากต้องการอ่านข้อมูลความดันโลหิต คุณต้องขอสิทธิ์ต่อไปนี้
<application>
<uses-permission
android:name="android.permission.health.READ_BLOOD_PRESSURE" />
...
</application>
เขียนข้อมูลสัญญาณชีพ
ส่วนนี้อธิบายวิธีเขียนข้อมูลค่าสัญญาณชีพลงใน Health Connect โดยปกติแล้ว ข้อมูลค่าสัญญาณชีพจะเขียนเป็นบันทึกข้อมูลแต่ละรายการ หากคุณเขียนบันทึกข้อมูลหลายรายการพร้อมกัน เช่น การซิงค์จากเซ็นเซอร์หรือแบ็กเอนด์ ให้ใช้การจัดกลุ่ม
ตัวอย่างการเขียน BloodPressureRecord
suspend fun writeBloodPressureRecord(healthConnectClient: HealthConnectClient) { val record = BloodPressureRecord( time = Instant.now(), zoneOffset = ZoneOffset.UTC, systolic = Pressure.millimetersOfMercury(120.0), diastolic = Pressure.millimetersOfMercury(80.0), bodyPosition = BloodPressureRecord.BODY_POSITION_SITTING_DOWN, measurementLocation = BloodPressureRecord.MEASUREMENT_LOCATION_LEFT_WRIST ) healthConnectClient.insertRecords(listOf(record)) }
การเขียนแบบจัดกลุ่ม
หากแอปของคุณต้องเขียนจุดข้อมูลหลายจุด เช่น การซิงค์ข้อมูลจากอุปกรณ์ที่เชื่อมต่อหรือบริการแบ็กเอนด์ คุณควรเขียนแบบจัดกลุ่มเพื่อปรับปรุงประสิทธิภาพและลดการใช้แบตเตอรี่ Health Connect สามารถจัดการบันทึกข้อมูลได้สูงสุด 1,000 รายการในคำขอเขียนรายการเดียว
โค้ดต่อไปนี้แสดงวิธีเขียนบันทึกข้อมูลหลายรายการพร้อมกันแบบจัดกลุ่ม
suspend fun writeBatchRecords(healthConnectClient: HealthConnectClient) { val bloodPressureRecord = BloodPressureRecord( time = Instant.now(), zoneOffset = ZoneOffset.UTC, systolic = Pressure.millimetersOfMercury(120.0), diastolic = Pressure.millimetersOfMercury(80.0), bodyPosition = BloodPressureRecord.BODY_POSITION_SITTING_DOWN, measurementLocation = BloodPressureRecord.MEASUREMENT_LOCATION_LEFT_WRIST ) val heartRateRecord = HeartRateRecord( startTime = Instant.now().minusSeconds(60), startZoneOffset = ZoneOffset.UTC, endTime = Instant.now(), endZoneOffset = ZoneOffset.UTC, samples = listOf(HeartRateRecord.Sample(time = Instant.now().minusSeconds(30), beatsPerMinute = 80)) ) healthConnectClient.insertRecords(listOf(bloodPressureRecord, heartRateRecord)) }
การอ่านข้อมูลค่าสัญญาณชีพ
แอปสามารถอ่านข้อมูลค่าสัญญาณชีพเพื่อแสดงการวัด วิเคราะห์แนวโน้ม หรือซิงค์ข้อมูลกับเซิร์ฟเวอร์ภายนอก หากต้องการอ่านค่าสัญญาณชีพ ให้ใช้ ReadRecordsRequest กับประเภทบันทึกข้อมูลที่เฉพาะเจาะจงและกรองตามช่วงเวลา
ตัวอย่างการอ่าน BloodPressureRecord ข้อมูล:
suspend fun readBloodPressureRecords( healthConnectClient: HealthConnectClient, startTime: Instant, endTime: Instant ) { val response = healthConnectClient.readRecords( ReadRecordsRequest( recordType = BloodPressureRecord::class, timeRangeFilter = TimeRangeFilter.between(startTime, endTime) ) ) for (record in response.records) { // Process each blood pressure record val systolic = record.systolic val diastolic = record.diastolic } }
หากต้องการซิงค์ข้อมูลค่าสัญญาณชีพกับเซิร์ฟเวอร์แบ็กเอนด์ หรือทำให้พื้นที่เก็บข้อมูลของแอปเป็นข้อมูลล่าสุดด้วย Health Connect ให้ใช้ ChangeLogs ซึ่งจะช่วยให้คุณดึงรายการบันทึกข้อมูลที่แทรก อัปเดต หรือลบตั้งแต่จุดเวลาที่เฉพาะเจาะจงได้ ซึ่งมีประสิทธิภาพมากกว่าการติดตามการเปลี่ยนแปลงด้วยตนเองหรือการอ่านข้อมูลทั้งหมดซ้ำๆ ดูข้อมูลเพิ่มเติมได้ที่ ซิงค์ข้อมูลกับ Health Connect
แนวทางปฏิบัติแนะนำ
ทำตามหลักเกณฑ์ต่อไปนี้เพื่อปรับปรุงความน่าเชื่อถือของข้อมูลและประสบการณ์การใช้งานของผู้ใช้
- ความถี่ในการเขียนและการจัดกลุ่ม: หากต้องการลดค่าใช้จ่ายในการป้อน/ส่งออกและประหยัดแบตเตอรี่ ให้จัดกลุ่มจุดข้อมูลลงในคำขอ
insertRecordsรายการเดียวที่มีการจัดกลุ่มบันทึกข้อมูลได้สูงสุด 1,000 รายการ แทนที่จะเขียนแต่ละจุดแยกกัน- การติดตามแบบสด: สำหรับการอัปเดตจากเซ็นเซอร์บ่อยๆ (เช่น เครื่องตรวจน้ำตาลแบบต่อเนื่องหรือเครื่องวัดอัตราการเต้นของหัวใจ) ให้เขียนข้อมูลแบบจัดกลุ่มเป็นช่วงเวลาไม่เกิน 15 นาทีเพื่อสร้างสมดุลระหว่างการอัปเดตแบบเรียลไทม์กับประสิทธิภาพของแบตเตอรี่
- การซิงค์เบื้องหลัง: ใช้
WorkManagerสำหรับการเขียนที่เลื่อนออกไป เช่น การซิงค์ข้อมูลจากอุปกรณ์ที่ใช้ร่วมกันหรือบริการแบ็กเอนด์ โดยกำหนดช่วงเวลาสำหรับการเขียนแบบจัดกลุ่มไว้ที่ 15 นาที
หลีกเลี่ยงการเขียนข้อมูลซ้ำ: ใช้รหัสไคลเอ็นต์ เมื่อสร้างบันทึกข้อมูล ให้ตั้งค่า
metadata.clientRecordIdHealth Connect ใช้รหัสนี้เพื่อระบุบันทึกข้อมูลที่ไม่ซ้ำกัน หากคุณพยายามเขียนบันทึกข้อมูลที่มีclientRecordIdอยู่แล้ว Health Connect จะไม่สนใจรายการซ้ำหรืออัปเดตบันทึกข้อมูลที่มีอยู่แทนที่จะสร้างรายการใหม่ การตั้งค่าmetadata.clientRecordIdเป็นวิธีที่มีประสิทธิภาพที่สุดในการป้องกันรายการซ้ำระหว่างการลองซิงค์อีกครั้งหรือการติดตั้งแอปใหม่val record = BloodPressureRecord( time = Instant.now(), zoneOffset = ZoneOffset.UTC, systolic = Pressure.millimetersOfMercury(120.0), diastolic = Pressure.millimetersOfMercury(80.0), bodyPosition = BloodPressureRecord.BODY_POSITION_SITTING_DOWN, measurementLocation = BloodPressureRecord.MEASUREMENT_LOCATION_LEFT_WRIST, metadata = Metadata( // Use a unique ID from your own database clientRecordId = "bp_20240101_user123" ) )
ตรวจสอบข้อมูลที่มีอยู่: ก่อนซิงค์ข้อมูล ให้ค้นหาบันทึกข้อมูลใน Health Connect ภายในช่วงเวลาซิงค์เพื่อดูว่ามีข้อมูลจากแอปของคุณอยู่แล้วหรือไม่ เพื่อหลีกเลี่ยงรายการซ้ำหรือการเขียนทับข้อมูลใหม่กว่า
ให้เหตุผลที่ชัดเจนในการขอสิทธิ์: ใช้โฟลว์
Permission.createIntentเพื่ออธิบายว่าทำไมแอปของคุณจึงต้องเข้าถึงข้อมูลสุขภาพ เช่น "เพื่อตรวจสอบแนวโน้มความดันโลหิตและให้ข้อมูลเชิงลึก"จัดเวลาประทับให้สอดคล้องกับการวัด: ตรวจสอบว่าเวลาประทับของบันทึกข้อมูลแสดงเวลาที่ทำการวัดอย่างถูกต้อง สำหรับข้อมูลตามช่วงเวลา เช่น
HeartRateRecordให้ตรวจสอบว่าstartTimeและendTimeถูกต้อง
การทดสอบ
หากต้องการยืนยันความถูกต้องของข้อมูลและประสบการณ์การใช้งานของผู้ใช้ที่มีคุณภาพสูง ให้ทำตาม กลยุทธ์การทดสอบต่อไปนี้และดูเอกสารประกอบกรณีการใช้งานยอดนิยมสำหรับการทดสอบ อย่างเป็นทางการ
เครื่องมือยืนยัน
- กล่องเครื่องมือ Health Connect: ใช้แอปคู่กันนี้เพื่อตรวจสอบ บันทึกข้อมูลด้วยตนเอง ลบข้อมูลทดสอบ และจำลองการเปลี่ยนแปลงฐานข้อมูล ซึ่งเป็นวิธีที่ดีที่สุดในการยืนยันว่าระบบจัดเก็บข้อมูลบันทึกอย่างถูกต้อง
- การทำ Unit Test ด้วย
FakeHealthConnectClient: ใช้ไลบรารีการทดสอบ เพื่อยืนยันวิธีที่แอปของคุณจัดการกรณีขอบ เช่น การเพิกถอนสิทธิ์หรือข้อยกเว้นของ API โดยไม่ต้องใช้อุปกรณ์จริง
รายการตรวจสอบคุณภาพ
สถาปัตยกรรมทั่วไป
การติดตั้งใช้งานข้อมูลค่าสัญญาณชีพมักจะประกอบด้วยสิ่งต่อไปนี้
| คอมโพเนนต์ | จัดการ |
|---|---|
| ตัวควบคุมข้อมูลสัญญาณชีพ | การอ่านข้อมูลจากเซ็นเซอร์/การป้อนข้อมูล ตรรกะการจัดกลุ่ม |
| เลเยอร์ Repository (ครอบคลุมการดำเนินการของ Health Connect) | แทรกบันทึกค่าสัญญาณชีพ อ่านบันทึกค่าสัญญาณชีพ |
| เลเยอร์ UI (แสดง) | ค่าที่อ่านได้แบบเรียลไทม์ ข้อมูลย้อนหลัง แผนภูมิและแนวโน้ม |
การแก้ปัญหา
| ลักษณะปัญหา | สาเหตุที่เป็นไปได้ | ความละเอียด |
|---|---|---|
| ไม่มีข้อมูลบางประเภท (เช่น ความดันโลหิต) | ไม่มีสิทธิ์เขียนหรือตัวกรองเวลาไม่ถูกต้อง | ตรวจสอบว่าคุณได้ขอสิทธิ์สำหรับข้อมูลประเภทที่เฉพาะเจาะจงแล้วและผู้ใช้ได้ให้สิทธิ์ดังกล่าวแล้ว ตรวจสอบว่า ReadRecordsRequest ใช้ TimeRangeFilter ที่ครอบคลุมเวลาที่ทำการวัด ดูสิทธิ์ |
| บันทึกข้อมูลซ้ำปรากฏขึ้น | ไม่มี clientRecordId |
กำหนด clientRecordId ที่ไม่ซ้ำกันใน Metadata ของบันทึกข้อมูลแต่ละรายการ ซึ่งจะช่วยให้ Health Connect ทำการลบรายการซ้ำได้หากมีการเขียนข้อมูลเดียวกัน 2 ครั้งระหว่างการลองซิงค์อีกครั้ง ดูแนวทางปฏิบัติแนะนำ |
| เขียนบันทึกข้อมูลไม่สำเร็จ | หน่วยหรือค่าไม่ถูกต้องอยู่นอกช่วงที่ถูกต้อง | Health Connect จะตรวจสอบค่าบันทึกข้อมูล เช่น ค่าความดันโลหิตต้องอยู่ในช่วงที่สมเหตุสมผลทางสรีรวิทยา ตรวจสอบเอกสารประกอบของข้อมูลประเภทต่างๆ เพื่อดูช่วงและหน่วยที่ถูกต้อง |
ขั้นตอนการแก้ไขข้อบกพร่องทั่วไป
| ตรวจสอบสถานะสิทธิ์ | เรียกใช้ getPermissionStatus() ทุกครั้งก่อนพยายามดำเนินการอ่านหรือเขียน ผู้ใช้สามารถเพิกถอนสิทธิ์ในการตั้งค่าระบบได้ทุกเมื่อ |