1. Giới thiệu
Health Connect là gì?
Health Connect là nền tảng dữ liệu sức khoẻ dành cho các nhà phát triển ứng dụng Android. Nền tảng này cung cấp một giao diện hợp nhất và đơn nhất để truy cập vào dữ liệu về sức khoẻ và hoạt động thể dục của người dùng, cũng như hành vi chức năng nhất quán trên tất cả thiết bị. Nhờ Health Connect, người dùng có thể lưu trữ dữ liệu về sức khoẻ và hoạt động thể dục trên thiết bị một cách an toàn với quyền truy cập minh bạch và có toàn quyền kiểm soát.
Health Connect hoạt động như thế nào?
Health Connect hỗ trợ hơn 50 loại và danh mục dữ liệu về sức khoẻ và hoạt động thể dục bao gồm: hoạt động, giấc ngủ, dinh dưỡng, số đo cơ thể và các chỉ số sức khoẻ như nhịp tim và huyết áp.
Khi người dùng cho phép, nhà phát triển có thể đọc dữ liệu từ và ghi dữ liệu vào Health Connect một cách bảo mật bằng hành vi API và giản đồ chuẩn hoá. Người dùng có toàn quyền kiểm soát các chế độ cài đặt quyền riêng tư của họ, với các lựa chọn kiểm soát chi tiết để xem ứng dụng nào đang yêu cầu quyền truy cập vào dữ liệu tại bất kỳ thời điểm nào. Dữ liệu trong Health Connect được lưu trữ trên thiết bị và mã hoá. Người dùng có thể tắt quyền truy cập hoặc xoá dữ liệu họ không muốn có trên thiết bị của mình, đồng thời có thể ưu tiên nguồn dữ liệu này hơn nguồn dữ liệu khác khi sử dụng nhiều ứng dụng.
Cấu trúc của Health Connect
Sau đây là nội dung giải thích về các chương trình thành phần chính và thành phần cấu trúc của Health Connect:
- Ứng dụng khách: Để tích hợp với Health Connect, trước tiên, ứng dụng khách sẽ liên kết SDK với ứng dụng sức khoẻ và thể dục, từ đó tạo nên một nền tảng API để tương tác với Health Connect API.
- Bộ phát triển phần mềm (SDK): SDK cho phép ứng dụng khách giao tiếp với tệp APK Health Connect.
- APK Health Connect Đây là tệp APK triển khai Health Connect. APK này chứa cả thành phần Quản lý quyền (Permissions Management) và Quản lý dữ liệu (Data Management). APK Health Connect được cung cấp trực tiếp trên thiết bị của người dùng, nhờ đó, ứng dụng Health Connect tập trung vào thiết bị thay vì tập trung vào tài khoản.
- Quản lý quyền: Health Connect sở hữu một giao diện người dùng, mà thông qua đó, ứng dụng sẽ yêu cầu quyền của người dùng để hiển thị dữ liệu. Ứng dụng này cũng cung cấp danh sách các quyền hiện tại của người dùng. Thông qua danh sách này, người dùng có thể kiểm soát và quản lý quyền truy cập họ đã cấp cho hoặc từ chối cấp cho các ứng dụng.
- Quản lý dữ liệu: Health Connect cung cấp giao diện người dùng với thông tin tổng quan về dữ liệu đã ghi, dữ liệu có thể là số bước người dùng đã đi, tốc độ đạp xe, nhịp tim hay các loại dữ liệu khác được hỗ trợ.
Sản phẩm bạn sẽ tạo ra
Trong lớp học lập trình này, bạn sẽ xây dựng một ứng dụng đơn giản về sức khoẻ và thể dục, có tích hợp Health Connect. Ứng dụng của bạn sẽ thực hiện những việc sau:
- Yêu cầu và kiểm tra sự cho phép của người dùng đối với việc truy cập dữ liệu.
- Ghi dữ liệu vào Health Connect.
- Đọc dữ liệu tổng hợp từ Health Connect.
Kiến thức bạn sẽ học được
- Cách thiết lập môi trường để hỗ trợ phát triển tính năng tích hợp Health Connect.
- Cách yêu cầu quyền và thực thi kiểm tra quyền.
- Cách đóng góp dữ liệu về sức khoẻ và hoạt động thể dục vào nền tảng Health Connect.
- Cách khai thác lợi ích từ bộ nhớ dữ liệu trên thiết bị.
- Cách xác thực ứng dụng bằng các công cụ dành cho nhà phát triển do Google cung cấp.
Bạn cần
- Phiên bản ổn định mới nhất của Android Studio.
- Thiết bị di động Android có phiên bản SDK Android từ 28 (Pie) trở lên
2. Thiết lập
Chuẩn bị ứng dụng Health Connect
Ứng dụng Health Connect chịu trách nhiệm xử lý tất cả yêu cầu mà ứng dụng của bạn gửi qua SDK Health Connect. Các yêu cầu này bao gồm việc lưu trữ dữ liệu cũng như quản lý quyền đọc và ghi dữ liệu đó.
Quyền truy cập vào Health Connect phụ thuộc vào phiên bản Android được cài đặt trên điện thoại. Các phần sau đây trình bày cách xử lý một số phiên bản Android gần đây.
Android 14
Từ Android 14 (API cấp 34) trở đi, Health Connect là một phần của Khung Android. Vì phiên bản Health Connect này là một mô-đun khung nên không cần thiết lập.
Android 13 trở xuống
Trên các phiên bản Android 13 (API cấp 33) trở xuống, Health Connect không phải là một phần của Khung Android. Do đó, bạn cần cài đặt ứng dụng Health Connect trên Cửa hàng Google Play. Hãy quét mã QR dưới đây để cài đặt Health Connect.
Nhận mã mẫu
Bắt đầu bằng cách sao chép mã nguồn có trên GitHub:
git clone https://github.com/android/android-health-connect-codelab.git
Thư mục mã mẫu chứa mã start
và finished
cho lớp học lập trình này. Trong khung hiển thị Project (Dự án) ở bên trái Android Studio, bạn sẽ thấy 2 mô-đun:
start
: Đoạn mã khởi đầu dành cho dự án này. Bạn sẽ thực hiện các thay đổi trong các đoạn mã này để hoàn thành lớp học lập trình.finished
: Đoạn mã hoàn chỉnh dành cho lớp học lập trình này, dùng để kiểm tra bài làm của bạn.
Khám phá mã bắt đầu
Ứng dụng mẫu Codelab có các giao diện người dùng cơ bản được xây dựng bằng Jetpack Compose, với các màn hình sau:
WelcomeScreen
: Đây là trang đích của ứng dụng, cho thấy các thông báo tuỳ thuộc vào tình trạng sẵn có của Health Connect (đã được cài đặt, chưa được cài đặt, hay không được hỗ trợ).PrivacyPolicyScreen
: Giải thích việc ứng dụng sử dụng các quyền, được hiển thị khi người dùng nhấp vào đường liên kết Chính sách quyền riêng tư trong hộp thoại quyền truy cập của Health Connect.InputReadingsScreen
: Minh hoạ hoạt động đọc và ghi bản ghi đơn giản về cân nặng.ExerciseSessionScreen
: Đây là nơi người dùng chèn và liệt kê các phiên tập thể dục. Thao tác nhấp vào bản ghi sẽ chuyển người dùng đếnExerciseSessionDetailScreen
để cho thấy thêm dữ liệu về phiên tập thể dục.DifferentialChangesScreen
: Minh hoạ cách lấy mã thông báo Changes (Thay đổi) và nhận các thay đổi mới từ Health Connect.
HealthConnectManager
lưu trữ tất cả hàm có tương tác với Health Connect. Trong lớp học lập trình này, chúng tôi sẽ hướng dẫn bạn hoàn thiện các chức năng thiết yếu theo từng bước. Chuỗi <!-- TODO:
trong bản dựng start
có các phần tương ứng trong lớp học lập trình này. Trong các phần đó, bạn sẽ được cung cấp mã mẫu để chèn vào dự án.
Hãy bắt đầu bằng cách thêm Health Connect vào dự án!
Thêm SDK ứng dụng Health Connect
Để bắt đầu sử dụng SDK Health Connect, bạn cần thêm phần phụ thuộc vào tệp build.gradle
. Để tìm phiên bản Health Connect mới nhất, hãy xem bản phát hành thư viện Jetpack.
dependencies {
// Add a dependency of Health Connect SDK
implementation "androidx.health.connect:connect-client:1.1.0-alpha10"
}
Khai báo chế độ hiển thị của Health Connect
Để tương tác với Health Connect
trong ứng dụng này, hãy khai báo tên gói Health Connect trong AndroidManifest.xml
:
<!-- TODO: declare Health Connect visibility -->
<queries>
<package android:name="com.google.android.apps.healthdata" />
</queries>
Chạy dự án khởi động
Sau khi thiết lập xong, hãy chạy dự án start
. Lúc này, bạn sẽ thấy màn hình chào mừng hiện dòng chữ "Health Connect is installed on this device" (Đã cài đặt Health Connect trên thiết bị này) và một ngăn trình đơn. Chúng ta sẽ thêm các chức năng để tương tác với Health Connect trong các phần sau.
3. Kiểm soát quyền
Health Connect khuyến nghị nhà phát triển chỉ nên giới hạn yêu cầu quyền với các loại dữ liệu được dùng trong ứng dụng. Yêu cầu quyền chung làm giảm niềm tin của người dùng đối với ứng dụng. Nếu một quyền bị từ chối nhiều hơn hai lần, ứng dụng của bạn sẽ bị khoá. Do đó, các yêu cầu cấp quyền sẽ không xuất hiện nữa.
Để phục vụ mục đích của lớp học lập trình này, chúng ta sẽ chỉ cần những quyền sau đây:
- Phiên tập thể dục
- Nhịp tim
- Số bước
- Tổng lượng calo đã đốt cháy
- Cân nặng
Khai báo quyền
Bạn cần khai báo mọi loại dữ liệu mà ứng dụng đọc hoặc ghi bằng cách sử dụng quyền trong AndroidManifest.xml
. Bắt đầu từ phiên bản 1.0.0-alpha10
, Health Connect sẽ sử dụng định dạng khai báo quyền tiêu chuẩn của Android.
Để khai báo quyền cho các loại dữ liệu cần thiết, hãy sử dụng các phần tử <uses-permission>
và gán tên tương ứng của các phần tử đó với quyền. Hãy lồng các tên này trong thẻ <manifest>
. Để xem danh sách đầy đủ các quyền và những loại dữ liệu tương ứng, hãy xem nội dung Danh sách loại dữ liệu.
<!-- TODO: Required to specify which Health Connect permissions the app can request -->
<uses-permission android:name="android.permission.health.READ_HEART_RATE"/>
<uses-permission android:name="android.permission.health.WRITE_HEART_RATE"/>
<uses-permission android:name="android.permission.health.READ_STEPS"/>
<uses-permission android:name="android.permission.health.WRITE_STEPS"/>
<uses-permission android:name="android.permission.health.READ_EXERCISE"/>
<uses-permission android:name="android.permission.health.WRITE_EXERCISE"/>
<uses-permission android:name="android.permission.health.READ_TOTAL_CALORIES_BURNED"/>
<uses-permission android:name="android.permission.health.WRITE_TOTAL_CALORIES_BURNED"/>
<uses-permission android:name="android.permission.health.READ_WEIGHT"/>
<uses-permission android:name="android.permission.health.WRITE_WEIGHT"/>
Khai báo bộ lọc ý định trong AndroidManifest.xml
để xử lý ý định sẽ giải thích cách ứng dụng sử dụng quyền. Ứng dụng cần xử lý ý định này và hiển thị chính sách quyền riêng tư, trong đó giải thích cách dùng và xử lý dữ liệu người dùng. Ý định này được gửi đến ứng dụng khi người dùng nhấp vào đường liên kết Chính sách quyền riêng tư trong hộp thoại cấp quyền truy cập của Health Connect.
<!-- TODO: Add intent filter to handle permission rationale intent -->
<!-- Permission handling for Android 13 and before -->
<intent-filter>
<action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE" />
</intent-filter>
<!-- Permission handling for Android 14 and later -->
<intent-filter>
<action android:name="android.intent.action.VIEW_PERMISSION_USAGE"/>
<category android:name="android.intent.category.HEALTH_PERMISSIONS"/>
</intent-filter>
Bây giờ, hãy mở lại ứng dụng để xem các quyền đã khai báo. Nhấp vào phần Settings (Cài đặt) trong ngăn trình đơn để chuyển đến màn hình Health Connect Settings (Cài đặt Health Connect). Sau đó, nhấp vào App permissions (Quyền cho ứng dụng), bạn sẽ thấy Health Connect Codelab (Lớp học lập trình về Health Connect) trong danh sách. Nhấp vào Lớp học lập trình Health Connect để xem danh sách các loại dữ liệu có quyền đọc và ghi trên ứng dụng đó.
Yêu cầu cấp quyền
Ngoài việc trực tiếp đưa người dùng đến phần Health Connect Settings (Cài đặt Health Connect) để quản lý quyền, bạn cũng có thể yêu cầu cấp quyền từ ứng dụng của mình thông qua API Health Connect. Xin lưu ý rằng người dùng có thể thay đổi quyền bất cứ lúc nào. Vì vậy, hãy nhớ kiểm tra xem ứng dụng của bạn có các quyền cần thiết không. Trong dự án của lớp học lập trình, chúng ta sẽ kiểm tra và gửi yêu cầu cấp quyền trước khi đọc hoặc ghi dữ liệu.
HealthConnectClient
là điểm truy cập vào API Health Connect. Trong HealthConnectManager.kt
, hãy lấy một thực thể HealthConnectClient
.
private val healthConnectClient by lazy { HealthConnectClient.getOrCreate(context) }
Để bắt đầu hộp thoại yêu cầu quyền truy cập trong ứng dụng, trước tiên hãy tạo một nhóm quyền cho các loại dữ liệu cần thiết. Bạn phải yêu cầu quyền truy cập đối với các loại dữ liệu mà bạn chỉ sử dụng.
Ví dụ: trong màn hình Record weight (Ghi lại cân nặng), bạn chỉ cần cấp quyền đọc và ghi cho loại dữ liệu Weight (Cân nặng). Chúng ta đã tạo một nhóm quyền được trong InputReadingsViewModel.kt
như minh hoạ trong mã sau.
val permissions = setOf(
HealthPermission.getReadPermission(WeightRecord::class),
HealthPermission.getWritePermission(WeightRecord::class),
)
Sau đó, hãy kiểm tra xem các quyền đó đã được cấp hay chưa trước khi gửi yêu cầu cấp quyền. Trong HealthConnectManager.kt
, hãy sử dụng getGrantedPermissions
để kiểm tra xem quyền đối với các loại dữ liệu bắt buộc đã được cấp hay chưa. Để khởi chạy yêu cầu cấp quyền, bạn phải tạo ActivityResultContract
bằng cách sử dụng PermissionController.createRequestPermissionResultContract()
(sẽ được khởi chạy khi các quyền cần thiết không được cấp).
suspend fun hasAllPermissions(permissions: Set<String>): Boolean {
return healthConnectClient.permissionController.getGrantedPermissions().containsAll(permissions)
}
fun requestPermissionsActivityContract(): ActivityResultContract<Set<String>, Set<String>> {
return PermissionController.createRequestPermissionResultContract()
}
Trong ứng dụng mẫu của lớp học lập trình này, bạn có thể thấy nút Request permissions (Yêu cầu cấp quyền) trên màn hình nếu chưa cấp quyền cho các loại dữ liệu cần thiết. Nhấp vào Request permissions (Yêu cầu quyền) để mở hộp thoại quyền của Health Connect. Cấp các quyền cần thiết và quay lại ứng dụng của lớp học lập trình.
4. Ghi dữ liệu
Hãy bắt đầu ghi bản ghi vào Health Connect. Để ghi một bản ghi Cân nặng, hãy tạo một đối tượng WeightRecord
có giá trị đầu vào về cân nặng. Lưu ý rằng SDK Health Connect hỗ trợ nhiều lớp đơn vị. Ví dụ: sử dụng Mass.kilograms(weightInput)
để thiết lập cân nặng tính theo kilogam cho người dùng.
Tất cả dữ liệu được ghi vào Health Connect phải nêu rõ thông tin về chênh lệch múi giờ. Việc nêu rõ thông tin về chênh lệch múi giờ trong quá trình ghi dữ liệu sẽ cung cấp thông tin về múi giờ khi đọc dữ liệu trong Health Connect.
Sau khi tạo bản ghi về cân nặng, hãy dùng healthConnectClient.insertRecords
để ghi dữ liệu vào Health Connect.
/**
* TODO: Writes [WeightRecord] to Health Connect.
*/
suspend fun writeWeightInput(weightInput: Double) {
val time = ZonedDateTime.now().withNano(0)
val weightRecord = WeightRecord(
weight = Mass.kilograms(weightInput),
time = time.toInstant(),
zoneOffset = time.offset
)
val records = listOf(weightRecord)
try {
healthConnectClient.insertRecords(records)
Toast.makeText(context, "Successfully insert records", Toast.LENGTH_SHORT).show()
} catch (e: Exception) {
Toast.makeText(context, e.message.toString(), Toast.LENGTH_SHORT).show()
}
}
Bây giờ, hãy chạy ứng dụng. Nhấp vào màn hình Record weight (Ghi lại cân nặng) rồi nhập bản ghi mới về cân nặng tính theo kilogam. Để xác minh liệu bản ghi cân nặng đã được ghi thành công vào Health Connect hay chưa, hãy mở ứng dụng Health Connect trong phần Cài đặt rồi chuyển đến phần Dữ liệu và quyền truy cập -> Số đo cơ thể -> Cân nặng -> Xem tất cả các mục. Bạn sẽ thấy bản ghi mới về cân nặng được ghi từ Lớp học lập trình Health Connect.
Ghi phiên tập thể dục
Phiên hoạt động là khoảng thời gian người dùng thực hiện một hoạt động. Một phiên tập thể dục trong Health Connect có thể bao gồm mọi hoạt động từ chạy bộ đến chơi cầu lông. Phiên hoạt động cho phép người dùng đo lường hiệu suất hoạt động dựa trên thời gian. Dữ liệu này ghi lại một loạt các mẫu tức thì được đo trong một khoảng thời gian, chẳng hạn như nhịp tim liên tục hoặc các mẫu vị trí trong một hoạt động.
Ví dụ sau đây minh hoạ cách ghi một phiên tập thể dục. Sử dụng healthConnectClient.insertRecords
để chèn nhiều bản ghi dữ liệu về phiên tập thể dục. Yêu cầu chèn trong ví dụ này bao gồm ExerciseSessionRecord
với ExerciseType
, StepsRecord
với số bước, TotalCaloriesBurnedRecord
với Energy
và chuỗi mẫu HeartRateRecord
.
/**
* TODO: Writes an [ExerciseSessionRecord] to Health Connect.
*/
suspend fun writeExerciseSession(start: ZonedDateTime, end: ZonedDateTime) {
healthConnectClient.insertRecords(
listOf(
ExerciseSessionRecord(
startTime = start.toInstant(),
startZoneOffset = start.offset,
endTime = end.toInstant(),
endZoneOffset = end.offset,
exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_RUNNING,
title = "My Run #${Random.nextInt(0, 60)}"
),
StepsRecord(
startTime = start.toInstant(),
startZoneOffset = start.offset,
endTime = end.toInstant(),
endZoneOffset = end.offset,
count = (1000 + 1000 * Random.nextInt(3)).toLong()
),
TotalCaloriesBurnedRecord(
startTime = start.toInstant(),
startZoneOffset = start.offset,
endTime = end.toInstant(),
endZoneOffset = end.offset,
energy = Energy.calories((140 + Random.nextInt(20)) * 0.01)
)
) + buildHeartRateSeries(start, end)
)
}
/**
* TODO: Build [HeartRateRecord].
*/
private fun buildHeartRateSeries(
sessionStartTime: ZonedDateTime,
sessionEndTime: ZonedDateTime,
): HeartRateRecord {
val samples = mutableListOf<HeartRateRecord.Sample>()
var time = sessionStartTime
while (time.isBefore(sessionEndTime)) {
samples.add(
HeartRateRecord.Sample(
time = time.toInstant(),
beatsPerMinute = (80 + Random.nextInt(80)).toLong()
)
)
time = time.plusSeconds(30)
}
return HeartRateRecord(
startTime = sessionStartTime.toInstant(),
startZoneOffset = sessionStartTime.offset,
endTime = sessionEndTime.toInstant(),
endZoneOffset = sessionEndTime.offset,
samples = samples
)
}
5. Đọc dữ liệu
Bây giờ, bạn đã ghi các bản ghi về Cân nặng và Phiên tập thể dục bằng ứng dụng mẫu của lớp học lập trình và ứng dụng Toolbox. Hãy sử dụng API Health Connect để đọc các bản ghi đó. Trước tiên, hãy tạo một ReadRecordsRequest
rồi chỉ định loại bản ghi và phạm vi thời gian để đọc. ReadRecordsRequest
cũng có thể thiết lập dataOriginFilter
để chỉ định ứng dụng nguồn của bản ghi mà bạn muốn đọc.
/**
* TODO: Reads in existing [WeightRecord]s.
*/
suspend fun readWeightInputs(start: Instant, end: Instant): List<WeightRecord> {
val request = ReadRecordsRequest(
recordType = WeightRecord::class,
timeRangeFilter = TimeRangeFilter.between(start, end)
)
val response = healthConnectClient.readRecords(request)
return response.records
}
/**
* TODO: Obtains a list of [ExerciseSessionRecord]s in a specified time frame.
*/
suspend fun readExerciseSessions(start: Instant, end: Instant): List<ExerciseSessionRecord> {
val request = ReadRecordsRequest(
recordType = ExerciseSessionRecord::class,
timeRangeFilter = TimeRangeFilter.between(start, end)
)
val response = healthConnectClient.readRecords(request)
return response.records
}
Bây giờ, hãy chạy ứng dụng và kiểm tra xem bạn có thể xem danh sách các bản ghi cân nặng và phiên tập thể dục hay không.
6. Đọc dữ liệu ở chế độ nền
Khai báo quyền
Để truy cập dữ liệu sức khoẻ ở chế độ nền, hãy khai báo quyền READ_HEALTH_DATA_IN_BACKGROUND
trong tệp AndroidManifest.xml
.
<!-- TODO: Required to specify which Health Connect permissions the app can request -->
...
<uses-permission android:name="android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND" />
Kiểm tra phạm vi cung cấp của các tính năng
Vì người dùng không phải lúc nào cũng có phiên bản Health Connect mới nhất, nên tốt nhất bạn nên xác minh phạm vi cung cấp của các tính năng trước. Trong HealthConnectManager.kt
, chúng ta sử dụng phương thức getFeatureStatus
để thực hiện việc này.
fun isFeatureAvailable(feature: Int): Boolean{
return healthConnectClient
.features
.getFeatureStatus(feature) == HealthConnectFeatures.FEATURE_STATUS_AVAILABLE
}
Chức năng đọc dữ liệu ở chế độ nền trong ExerciseSessionViewModel.kt
được xác minh bằng hằng số FEATURE_READ_HEALTH_DATA_IN_BACKGROUND
:
backgroundReadAvailable.value = healthConnectManager.isFeatureAvailable(
HealthConnectFeatures.FEATURE_READ_HEALTH_DATA_IN_BACKGROUND
)
Yêu cầu cấp quyền
Sau khi xác minh rằng tính năng đọc dữ liệu ở chế độ nền có sẵn, bạn có thể yêu cầu quyền PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND bằng cách nhấp vào Request Background Read (Yêu cầu quyền đọc dữ liệu ở chế độ nền) trên màn hình Exercise sessions (Phiên tập thể dục).
Người dùng sẽ thấy lời nhắc sau đây:
Người dùng cũng có thể cấp quyền đọc dữ liệu ở chế độ nền bằng cách chuyển đến phần Health Connect > App permissions > Health Connect Codelab > Additional access (Health Connect > Quyền cho ứng dụng > Lớp học lập trình về Health Connect > Quyền truy cập bổ sung) trong phần cài đặt hệ thống:
Đọc dữ liệu ở chế độ nền
Dùng WorkManager
để lên lịch cho các tác vụ ở chế độ nền. Khi nhấn vào nút Read Steps In Background (Đọc các bước ở chế độ nền), ứng dụng sẽ khởi chạy ReadStepWorker
sau 10 giây trễ. Worker này sẽ truy xuất tổng số bước từ Health Connect trong 24 giờ qua. Sau đó, một mục nhập nhật ký tương tự nêu chi tiết thông tin này sẽ xuất hiện trong Logcat:
There are 4000 steps in Health Connect in the last 24 hours.
7. Đọc dữ liệu vi phân
Differential Changes API (API Thay đổi vi phân) của Health Connect giúp theo dõi các thay đổi từ một thời điểm cụ thể cho một tập hợp các loại dữ liệu. Ví dụ: bạn muốn biết liệu người dùng có cập nhật hoặc xoá bản ghi hiện có nào bên ngoài ứng dụng hay không, từ đó bạn có thể cập nhật cơ sở dữ liệu cho phù hợp.
Dữ liệu đọc bằng Health Connect bị hạn chế ở các ứng dụng chạy ở nền trước. Chúng tôi áp dụng biện pháp hạn chế này nhằm tăng cường bảo vệ quyền riêng tư của người dùng. Dịch vụ này thông báo và đảm bảo với người dùng rằng Health Connect không có quyền đọc dữ liệu ở chế độ nền và dữ liệu đó chỉ được đọc và truy cập ở nền trước. Khi ứng dụng chạy trên nền trước, API Thay đổi vi phân cho phép nhà phát triển truy xuất các thay đổi được thực hiện đối với Health Connect bằng cách triển khai mã thông báo thay đổi (Changes token).
Trong HealthConnectManager.kt
có hai hàm getChangesToken()
và getChanges()
. Chúng ta sẽ thêm các API Thay đổi vi phân vào các hàm này để nhận các thay đổi về dữ liệu.
Thiết lập mã thông báo thay đổi ban đầu
Các thay đổi về dữ liệu chỉ được truy xuất từ Health Connect khi ứng dụng yêu cầu bằng mã thông báo thay đổi. Mã thông báo thay đổi thể hiện thời điểm trong nhật ký cam kết mà dữ liệu vi phân sẽ được lấy kể từ thời điểm đó.
Để nhận mã thông báo thay đổi, hãy gửi ChangesTokenRequest
với một nhóm các loại dữ liệu bạn muốn theo dõi các thay đổi về dữ liệu. Giữ lại mã thông báo và sử dụng mã này khi bạn muốn truy xuất bất kỳ nội dung cập nhật nào từ Health Connect.
/**
* TODO: Obtains a Changes token for the specified record types.
*/
suspend fun getChangesToken(): String {
return healthConnectClient.getChangesToken(
ChangesTokenRequest(
setOf(
ExerciseSessionRecord::class
)
)
)
}
Cập nhật dữ liệu bằng mã thông báo thay đổi
Để nhận các thay đổi từ phiên đồng bộ hoá mới nhất giữa ứng dụng và Health Connect, bạn hãy sử dụng mã thông báo thay đổi (Changes token) đã nhận được trước đó và gửi lệnh gọi getChanges
bằng mã thông báo. ChangesResponse
trả về danh sách thay đổi đã quan sát được từ Health Connect, chẳng hạn như UpsertionChange
và DeletionChange
.
/**
* TODO: Retrieve changes from a Changes token.
*/
suspend fun getChanges(token: String): Flow<ChangesMessage> = flow {
var nextChangesToken = token
do {
val response = healthConnectClient.getChanges(nextChangesToken)
if (response.changesTokenExpired) {
throw IOException("Changes token has expired")
}
emit(ChangesMessage.ChangeList(response.changes))
nextChangesToken = response.nextChangesToken
} while (response.hasMore)
emit(ChangesMessage.NoMoreChanges(nextChangesToken))
}
Bây giờ, hãy chạy ứng dụng và chuyển đến màn hình Changes (Thay đổi). Trước tiên, hãy bật Track changes (Theo dõi thay đổi) để nhận mã thông báo thay đổi. Sau đó, hãy chèn dữ liệu về cân nặng hoặc phiên tập thể dục từ Hộp công cụ hoặc từ ứng dụng Codelab. Quay lại màn hình Changes (Thay đổi) rồi chọn Get new changes (Nhận thay đổi mới). Giờ thì bạn sẽ thấy các thay đổi về mức tăng.
8. Dữ liệu tổng hợp
Health Connect cũng cung cấp dữ liệu tổng hợp thông qua các API tổng hợp. Các ví dụ sau đây cho bạn biết cách lấy dữ liệu tích luỹ và dữ liệu thống kê từ Health Connect.
Sử dụng healthConnectClient.aggregate
để gửi AggregateRequest
. Trong yêu cầu tổng hợp, hãy xác định một tập hợp các chỉ số tổng hợp và khoảng thời gian mà bạn muốn xem. Ví dụ: ExerciseSessionRecord.EXERCISE_DURATION_TOTAL
và StepsRecord.COUNT_TOTAL
cung cấp dữ liệu tích luỹ, trong khi WeightRecord.WEIGHT_AVG
, HeartRateRecord.BPM_MAX
và HeartRateRecord.BPM_MIN
cung cấp dữ liệu thống kê.
/**
* TODO: Returns the weekly average of [WeightRecord]s.
*/
suspend fun computeWeeklyAverage(start: Instant, end: Instant): Mass? {
val request = AggregateRequest(
metrics = setOf(WeightRecord.WEIGHT_AVG),
timeRangeFilter = TimeRangeFilter.between(start, end)
)
val response = healthConnectClient.aggregate(request)
return response[WeightRecord.WEIGHT_AVG]
}
Ví dụ này cho biết cách nhận dữ liệu tổng hợp liên quan cho một phiên tập thể dục cụ thể. Trước tiên, hãy đọc một bản ghi bằng healthConnectClient.readRecord
với uid
. Sau đó, hãy sử dụng startTime
và endTime
của phiên tập thể dục làm khoảng thời gian và dataOrigin
làm bộ lọc để đọc các dữ liệu tổng hợp liên quan.
/**
* TODO: Reads aggregated data and raw data for selected data types, for a given [ExerciseSessionRecord].
*/
suspend fun readAssociatedSessionData(
uid: String,
): ExerciseSessionData {
val exerciseSession = healthConnectClient.readRecord(ExerciseSessionRecord::class, uid)
// Use the start time and end time from the session, for reading raw and aggregate data.
val timeRangeFilter = TimeRangeFilter.between(
startTime = exerciseSession.record.startTime,
endTime = exerciseSession.record.endTime
)
val aggregateDataTypes = setOf(
ExerciseSessionRecord.EXERCISE_DURATION_TOTAL,
StepsRecord.COUNT_TOTAL,
TotalCaloriesBurnedRecord.ENERGY_TOTAL,
HeartRateRecord.BPM_AVG,
HeartRateRecord.BPM_MAX,
HeartRateRecord.BPM_MIN,
)
// Limit the data read to just the application that wrote the session. This may or may not
// be desirable depending on the use case: In some cases, it may be useful to combine with
// data written by other apps.
val dataOriginFilter = setOf(exerciseSession.record.metadata.dataOrigin)
val aggregateRequest = AggregateRequest(
metrics = aggregateDataTypes,
timeRangeFilter = timeRangeFilter,
dataOriginFilter = dataOriginFilter
)
val aggregateData = healthConnectClient.aggregate(aggregateRequest)
val heartRateData = readData<HeartRateRecord>(timeRangeFilter, dataOriginFilter)
return ExerciseSessionData(
uid = uid,
totalActiveTime = aggregateData[ExerciseSessionRecord.EXERCISE_DURATION_TOTAL],
totalSteps = aggregateData[StepsRecord.COUNT_TOTAL],
totalEnergyBurned = aggregateData[TotalCaloriesBurnedRecord.ENERGY_TOTAL],
minHeartRate = aggregateData[HeartRateRecord.BPM_MIN],
maxHeartRate = aggregateData[HeartRateRecord.BPM_MAX],
avgHeartRate = aggregateData[HeartRateRecord.BPM_AVG],
heartRateSeries = heartRateData,
)
}
Bây giờ, hãy chạy ứng dụng và kiểm tra xem liệu bạn có thể xem cân nặng trung bình trên màn hình Record weight (Ghi lại cân nặng) hay không. Bạn cũng có thể xem dữ liệu chi tiết về một phiên tập thể dục bằng cách mở màn hình Exercise sessions (Phiên tập thể dục) rồi chọn một trong các bản ghi phiên tập thể dục.
9. Xin chúc mừng
Xin chúc mừng! Bạn đã tạo thành công ứng dụng sức khoẻ và thể dục tích hợp Health Connect đầu tiên của mình.
Ứng dụng có thể khai báo quyền và yêu cầu người dùng cấp quyền đối với các loại dữ liệu dùng trong ứng dụng. Ứng dụng này cũng có thể đọc và ghi dữ liệu từ bộ nhớ dữ liệu của Health Connect. Bạn cũng đã tìm hiểu cách sử dụng Hộp công cụ Health Connect để hỗ trợ phát triển ứng dụng bằng cách tạo dữ liệu mô phỏng trong bộ nhớ dữ liệu của Health Connect.
Giờ đây, bạn đã biết các bước quan trọng cần thiết để xây dựng ứng dụng sức khoẻ và thể dục trong hệ sinh thái Health Connect.