Ví dụ sau đây minh hoạ cách đọc dữ liệu thô trong quy trình công việc chung.
Đọc dữ liệu
Health Connect cho phép các ứng dụng đọc dữ liệu từ kho dữ liệu khi ứng dụng ở nền trước và nền sau:
Đọc trên nền trước: Thông thường, bạn có thể đọc dữ liệu từ Health Connect khi ứng dụng ở nền trước. Trong những trường hợp này, bạn có thể cân nhắc sử dụng dịch vụ trên nền trước để chạy thao tác này trong trường hợp người dùng hoặc hệ thống đặt ứng dụng của bạn ở chế độ nền trong quá trình đọc.
Đọc dữ liệu ở chế độ nền: Bằng cách yêu cầu người dùng cấp thêm quyền, bạn có thể đọc dữ liệu sau khi người dùng hoặc hệ thống đặt ứng dụng của bạn ở chế độ nền. Xem ví dụ hoàn chỉnh về hoạt động đọc dữ liệu ở chế độ nền.
Loại dữ liệu về Số bước trong Health Connect ghi lại số bước người dùng đi được giữa các kết quả đọc. Số bước chính là cách đo lường phổ biến trên các nền tảng về sức khoẻ, hoạt động thể chất và sức khoẻ tinh thần. Health Connect giúp bạn dễ dàng đọc và ghi dữ liệu về số bước.
Để đọc bản ghi, hãy tạo một ReadRecordsRequest
và cung cấp bản ghi đó khi bạn gọi readRecords
.
Ví dụ sau đây minh hoạ cách đọc dữ liệu về số bước của một người dùng trong một khoảng thời gian nhất định. Để xem ví dụ mở rộng về SensorManager
, hãy xem hướng dẫn về dữ liệu số bước.
suspend fun readHeartRateByTimeRange(
healthConnectClient: HealthConnectClient,
startTime: Instant,
endTime: Instant
) {
try {
val response = healthConnectClient.readRecords(
ReadRecordsRequest(
HeartRateRecord::class,
timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
)
)
for (record in response.records) {
// Process each record
}
} catch (e: Exception) {
// Run error handling here
}
}
Bạn cũng có thể đọc dữ liệu theo cách tổng hợp bằng hàm aggregate
.
suspend fun readStepsByTimeRange(
healthConnectClient: HealthConnectClient,
startTime: Instant,
endTime: Instant
) {
try {
val response = healthConnectClient.aggregate(
AggregateRequest(
metrics = setOf(StepsRecord.COUNT_TOTAL),
timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
)
)
// The result may be null if no data is available in the time range
val stepCount = response[StepsRecord.COUNT_TOTAL]
} catch (e: Exception) {
// Run error handling here
}
}
Ví dụ về hoạt động đọc ở chế độ nền
Để đọc dữ liệu ở chế độ nền, hãy khai báo quyền sau đây trong tệp kê khai:
<application>
<uses-permission android:name="android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND" />
...
</application>
Ví dụ sau đây minh hoạ cách đọc dữ liệu về số bước ở chế độ nền cho một người dùng trong một khoảng thời gian nhất định bằng cách sử dụng WorkManager
:
class ScheduleWorker(private val appContext: Context, workerParams: WorkerParameters):
CoroutineWorker(appContext, workerParams) {
override suspend fun doWork(): Result {
// Read data and process it.
...
// Return success indicating successful data retrieval
return Result.success()
}
}
if (healthConnectClient
.features
.getFeatureStatus(
HealthConnectFeatures.FEATURE_READ_HEALTH_DATA_IN_BACKGROUND
) == HealthConnectFeatures.FEATURE_STATUS_AVAILABLE) {
// Check if necessary permission is granted
val grantedPermissions = healthConnectClient.permissionController.getGrantedPermissions()
if (PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND !in grantedPermissions) {
// Perform read in foreground
...
} else {
// Schedule the periodic work request in background
val periodicWorkRequest = PeriodicWorkRequestBuilder<ScheduleWorker>(1, TimeUnit.HOURS)
.build()
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
"read_health_connect",
ExistingPeriodicWorkPolicy.KEEP,
periodicWorkRequest
)
}
} else {
// Background reading is not available, perform read in foreground
...
}
Tham số ReadRecordsRequest
có giá trị pageSize
mặc định là 1000.
Nếu số lượng bản ghi trong một readResponse
vượt quá pageSize
của yêu cầu, bạn cần lặp lại trên tất cả các trang của phản hồi để truy xuất tất cả bản ghi bằng cách sử dụng pageToken
.
Tuy nhiên, hãy cẩn thận để tránh các vấn đề về giới hạn tốc độ.
Ví dụ về cách đọc pageToken
Bạn nên dùng pageToken
để đọc các bản ghi nhằm truy xuất tất cả dữ liệu có sẵn trong khoảng thời gian được yêu cầu.
Ví dụ sau đây minh hoạ cách đọc tất cả các bản ghi cho đến khi hết tất cả mã thông báo trang:
val type = HeartRateRecord::class
val endTime = Instant.now()
val startTime = endTime.minus(Duration.ofDays(7))
try {
var pageToken: String? = null
do {
val readResponse =
healthConnectClient.readRecords(
ReadRecordsRequest(
recordType = type,
timeRangeFilter = TimeRangeFilter.between(
startTime,
endTime
),
pageToken = pageToken
)
)
val records = readResponse.records
// Do something with records
pageToken = readResponse.pageToken
} while (pageToken != null)
} catch (quotaError: IllegalStateException) {
// Backoff
}
Để biết thông tin về các phương pháp hay nhất khi đọc các tập dữ liệu lớn, hãy tham khảo bài viết Lập kế hoạch để tránh giới hạn tốc độ.
Đọc dữ liệu đã ghi trước đây
Nếu trước đây, một ứng dụng đã ghi bản ghi vào Health Connect, thì ứng dụng đó có thể đọc dữ liệu cũ. Cách này áp dụng cho các trường hợp mà trong đó, ứng dụng cần đồng bộ hoá lại với Health Connect sau khi người dùng cài đặt lại ứng dụng này.
Có một số hạn chế khi đọc:
Đối với Android 14 trở lên
- Không có giới hạn về thời gian lưu giữ dữ liệu trong quá khứ đối với ứng dụng đọc dữ liệu của chính mình.
- Giới hạn 30 ngày đối với việc một ứng dụng đọc dữ liệu khác.
Đối với Android 13 trở xuống
- Giới hạn 30 ngày đối với việc ứng dụng đọc mọi dữ liệu.
Bạn có thể xoá các hạn chế này bằng cách yêu cầu Quyền đọc.
Để đọc dữ liệu trong quá khứ, bạn cần biểu thị tên gói ở dạng đối tượng DataOrigin
trong tham số dataOriginFilter
của ReadRecordsRequest
.
Ví dụ sau đây minh hoạ cách biểu thị tên gói khi đọc bản ghi về nhịp tim:
try {
val response = healthConnectClient.readRecords(
ReadRecordsRequest(
recordType = HeartRateRecord::class,
timeRangeFilter = TimeRangeFilter.between(startTime, endTime),
dataOriginFilter = setOf(DataOrigin("com.my.package.name"))
)
)
for (record in response.records) {
// Process each record
}
} catch (e: Exception) {
// Run error handling here
}
Đọc dữ liệu cũ hơn 30 ngày
Theo mặc định, tất cả ứng dụng đều có thể đọc dữ liệu từ Health Connect trong vòng tối đa 30 ngày trước thời điểm cấp quyền lần đầu.
Nếu bạn cần mở rộng quyền đọc ngoài bất kỳ hạn chế mặc định nào, hãy yêu cầu PERMISSION_READ_HEALTH_DATA_HISTORY
.
Nếu không có quyền này, việc cố gắng đọc các bản ghi cũ hơn 30 ngày sẽ dẫn đến lỗi.
Nhật ký quyền của một ứng dụng đã bị xoá
Nếu người dùng xoá ứng dụng của bạn, tất cả các quyền, bao gồm cả quyền truy cập nhật ký, sẽ bị thu hồi. Nếu người dùng cài đặt lại ứng dụng của bạn và cấp lại quyền, thì các hạn chế mặc định tương tự sẽ được áp dụng và ứng dụng của bạn có thể đọc dữ liệu của Health Connect trong vòng tối đa 30 ngày trước ngày mới đó.
Ví dụ: giả sử người dùng xoá ứng dụng của bạn vào ngày 10 tháng 5 năm 2023 rồi cài đặt lại ứng dụng vào ngày 15 tháng 5 năm 2023 và cấp quyền đọc. Theo mặc định, ứng dụng của bạn có thể đọc dữ liệu từ ngày 15 tháng 4 năm 2023.