Ứng dụng tích hợp Health Connect đầu tiên của bạn

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

1. Giới thiệu

e4a4985ad1cdae8b.png

Lần cập nhật gần đây nhất: ngày 21 tháng 9 năm 2022

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ẻ thể chất và tinh thần 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ẻ thể chất và tinh thần 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ề hoạt động thể dục và sức khoẻ 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.

Cách Health Connect hoạt động

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

cấu trúc

Sau đây là nội dung giải thích về các khía cạnh 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ể hình, từ đó tạo nên một nền tảng API để tương tác với API Health Connect.
  • Bộ phát triển phần mềm – SDK cho phép ứng dụng khách giao tiếp với APK Health Connect qua IPC.
  • APK Health Connect – đây là 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. Điều này cho phép người dùng dễ dàng 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 của người dùng, 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ể hình, có tích hợp Health Connect. Ứng dụng này sẽ:

  • Yêu cầu và kiểm tra quyền của người dùng để 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ề hoạt động thể chất và sức khoẻ 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 có

  • Phiên bản ổn định mới nhất của Android Studio
  • Thiết bị di động Android có SDK Android phiên bản 28 (Pie) trở lên

2. Thiết lập

Cài đặt Health Connect

Health Connect hiện có trên Cửa hàng Play, hãy cài đặt Health Connect trên thiết bị di động để xử lý mọi yêu cầu mà ứng dụng của bạn gửi qua SDK Health Connect. Quét mã QR dưới đây để cài đặt Health Connect.

633ed0490a74595d.png

Nhận mã mẫu

Thư mục mẫu chứa mã start (bắt đầu) và finished (kết thúc) dành 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 – mã khởi động dành cho dự án này; bạn sẽ sửa đổi mã này để hoàn tất lớp học lập trình
  • finished – mã đã hoàn tất dành cho lớp học lập trình, dùng để kiểm tra bài làm

Khám phá mã khởi động

Ứng dụng mẫu Codelab có các giao diện người dùng cơ bản do Jetpack Compose xây dựng với các màn hình sau:

  • WelcomeScreen là trang đích của ứng dụng, trang này hiển thị các thông báo tuỳ theo khả năng sử dụng Health Connect (đã cài đặt, chưa cài đặt, chưa được hỗ trợ).
  • PrivacyPolicyScreen giải thích cách ứng dụng sử dụng quyền. Màn hình này sẽ hiển thị với người 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 quyền của Health Connect.
  • InputReadingsScreen minh hoạ hoạt động đọc và ghi bản ghi đơn giản về trọng lượng.
  • ExerciseSessionScreen cho phép 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 đến ExerciseSessionDetailScreen để 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ả các chức năng 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 mã khởi động 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.0.0-alpha11"
}

Khai báo chế độ hiển thị của Health Connect

Để tương tác với Health Connect trong ứng dụng, hãy khai báo tên gói Health Connect trong tệp AndroidManifest.xml:

<!-- TODO: declare Health Connect visibility -->
<queries>
   <package android:name="com.google.android.apps.healthdata" />
</queries>

Chạy dự án khởi động

Lúc này, bạn sẽ có thể thấy màn hình chào mừng hiện nội dung "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 tôi sẽ thêm các chức năng để tương tác với Health Connect trong các phần sau.

d54773774e4dc9f.png 462cd7b6cf553ad.png

3. Kiểm soát quyền

Health Connect khuyến nghị nhà phát triển chỉ nên giới hạn quyền truy cập trong các loại dữ liệu được dùng trong ứng dụng. Yêu cầu quyền truy cập 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 2 lần, ứng dụng của bạn sẽ bị chặn (tức là yêu cầu cấp quyền sẽ không còn xuất hiện).

Để 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
  • Trọng lượ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. Kể từ phiên bản alpha10 trở lên, 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ẻ <application>. Để xem danh sách đầy đủ các quyền và những loại dữ liệu tương ứng, hãy xem bài viết Danh sách loại dữ liệu.

<!-- TODO: declare Health Connect permissions -->
  <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 bên dưới trong AndroidManifest.xml để xử lý ý định sẽ diễn giải cách ứng dụng của bạn 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 quyền của Health Connect.

<!-- TODO: Add intent filter to handle permission rationale intent -->
<intent-filter>
    <action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE" />
</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 "Cài đặt" từ ngăn trình đơn, bạn sẽ đến màn hình Cài đặt Health Connect. Nhấp vào "App permissions" (Quyền cho ứng dụng), bạn sẽ thấy "Lớp học lập trình Health Connect" trong danh sách. Nhấp vào Lớp học lập trình Health Connect, bạn sẽ thấy danh sách các loại dữ liệu để truy cập chức năng đọc và ghi.

fbed69d871f92178.png 1b9c7764c1dbdfac.png

Yêu cầu cấp quyền

Ngoài việc trực tiếp đưa người dùng đến màn hình Cài đặt Health Connect để quản lý các quyền, API Health Connect cũng hỗ trợ bạn yêu cầu cấp quyền từ ứng dụng của mình. 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 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 trong ứng dụng, trước tiên, hãy tạo một tập hợp các quyền cho các loại dữ liệu cần thiết. Bạn chỉ nên yêu cầu cấp quyền đối với các loại dữ liệu mà bạn sẽ dùng.

Ví dụ: trong màn hình Record weight (Ghi lại trọng lượng), bạn chỉ cần cấp quyền đọc và ghi cho Weight. Chúng ta đã tạo một quyền được đặt trong InputReadingsViewModel.kt như hình minh hoạ bên dưới.

  val permissions = setOf(
    HealthPermission.getReadPermission(WeightRecord::class),
    HealthPermission.getWritePermission(WeightRecord::class),
  )

Sau đó, hãy kiểm tra xem 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. Để chạy yêu cầu cấp quyền, trước tiên, bạn phải tạo ActivityResultContract bằng PermissionController.createRequestPermissionResultContract() của SDK Health Connect, sau đó chạy ứng dụng này nếu 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 bạn chưa cấp quyền cho các loại dữ liệu cần thiết. Thao tác nhấp vào nút Request permissions (Yêu cầu cấp quyền) sẽ chuyển bạn đến 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.

626eedcec23659ce.png 6df6cf0e5c4a1a9e.png

4. Ghi dữ liệu

Hãy bắt đầu ghi bản ghi vào Health Connect. Để ghi một bản ghi Weight, hãy tạo một đối tượng WeightRecord có giá trị đầu vào về trọng lượng. Lưu ý rằng SDK Health Connect hỗ trợ nhiều lớp đơn vị, ví dụ: sử dụng Mass.kilograms(weightInput) để đặt trọng lượng tính theo kilogam cho người dùng.

Tất cả dữ liệu được ghi vào Health Connect phải chỉ định thông tin về Chênh lệch múi giờ. Việc chỉ định thông tin Zone Offset (Chênh lệch múi giờ) cho 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ề trọng lượ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 trọng lượng) rồi nhập bản ghi mới về trọng lượng tính theo kilogam. Để xác minh xem Health Connect đã ghi thành công bản ghi về trọng lượng hay chưa, hãy mở màn hình Health Connect Settings (Cài đặt Health Connect) rồi nhấp vào Data and access -> Body measurements -> Weight -> See all entries (Dữ liệu và quyền truy cập -> Số đo cơ thể -> Trọng lượng -> Xem tất cả các mục). Bạn sẽ thấy bản ghi mới về trọng lượ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, ví dụ 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. Hộp công cụ Health Connect

Giới thiệu về Hộp công cụ Health Connect

Hộp công cụ Health Connect là một công cụ bổ trợ dành cho nhà phát triển, giúp bạn dễ dàng kiểm thử tính năng tích hợp ứng dụng của mình với Health Connect. Hộp công cụ Health Connect có thể dễ dàng đọc và ghi dữ liệu trực tiếp vào Health Connect, nhờ vậy bạn dễ dàng kiểm thử được các hoạt động CRUD của ứng dụng.

Trong lớp học lập trình này, chúng ta sẽ sử dụng Bộ công cụ Health Connect để kiểm thử chức năng đọc và ghi mà bạn vừa triển khai.

Thiết lập Hộp công cụ Health Connect

Sử dụng adb để cài đặt APK Toolbox trên thiết bị đã kết nối bằng lệnh:

$ adb install HealthConnectToolbox-{Version Number}.apk

Lần đầu tiên mở ứng dụng Hộp công cụ Health Connect, bạn sẽ được chuyển đến phần cài đặt quyền trong phần Apps > Special app access > Display over other apps (Ứng dụng > Quyền truy cập đặc biệt > Hiển thị trên các ứng dụng khác). Quyền này cho phép Hộp công cụ Health Connect hiển thị một lớp phủ trên các ứng dụng khác để bạn có thể dễ dàng kiểm thử chức năng đọc và ghi dữ liệu mà không cần rời khỏi ứng dụng bạn đang phát triển.

Sau đó, trong màn hình chính của Hộp công cụ, bạn có thể mở ứng dụng Health Connect hoặc trực tiếp chuyển đến quy trình cấp quyền để cấp tất cả quyền đọc và ghi của Health Connect nhằm kiểm thử sau.

c3e6fd40b03b408a.png

Đọc và ghi hồ sơ sức khoẻ

Hộp công cụ Health Connect hỗ trợ đọc và ghi tất cả các loại dữ liệu Health Connect. Trong buổi học cuối cùng của lớp học lập trình, bạn đã ghi thành công các bản ghi về Trọng lượng và Phiên tập thể dục vào Health Connect. Hãy kiểm tra xem bạn có thể đọc dữ liệu từ Hộp công cụ Health Connect hay không.

Trước khi đọc và ghi dữ liệu vào Health Connect, bạn phải được người dùng cấp quyền. Điều này cũng áp dụng đối với Hộp công cụ Health Connect. Trước tiên, hãy chấp nhận yêu cầu cấp quyền từ Hộp công cụ Health Connect. Tiếp theo, hãy nhấp vào biểu tượng tìm kiếm 1f407c55884bb8c3.png trong trình đơn lớp phủ để mở hộp thoại, chọn loại dữ liệu (ví dụ: Trọng lượng) rồi nhấp vào nút READ HEALTH RECORD (ĐỌC DỮ LIỆU SỨC KHOẺ). Bạn sẽ thấy các dữ liệu từ ứng dụng mẫu của lớp học lập trình mà bạn vừa ghi vào Health Connect.

Để chèn một bản ghi vào Health Connect, hãy nhấp vào biểu tượng chỉnh sửa 10c524823c596aea.png trong trình đơn lớp phủ để mở hộp thoại rồi chọn loại dữ liệu. Hãy chèn một dữ liệu về Trọng lượng từ Hộp công cụ. Trong buổi học tiếp theo, chúng tôi sẽ hướng dẫn bạn cách đọc bản ghi bằng API Health Connect và hiển thị dữ liệu trong ứng dụng.

cac9d4c249a1d107.png

6. Đọc dữ liệu

Bây giờ, bạn đã ghi các bản ghi về Trọng lượ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 hoặc ứng dụng Hộp công cụ. 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ể đặt 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 trọng lượng và phiên tập thể dục hay không.

a08af54eef6bc832.png 3b0781389f1094a1.png

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 người dùng có cập nhật hoặc xoá bất kỳ 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()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 lịch sử 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 tập hợp 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,
          StepsRecord::class,
          TotalCaloriesBurnedRecord::class,
          HeartRateRecord::class,
          WeightRecord::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 đã nhận được trước đó và gửi lệnh gọi getChanges bằng mã thông báo. ChangesResponse sẽ có một danh sách UpsertionChangeDeletionChange được ghi nhận từ Health Connect.

  /**
   * 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 nút bật tắ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ề trọng lượng hay phiên tập thể dục từ Hộp công cụ hoặc từ ứng dụng của lớp học lập trình. Quay lại màn hình Changes (Thay đổi) rồi nhấp vào nút Get new changes (Nhận thay đổi mới), bạn sẽ thấy các thay đổi nâng cao.

f3aded8ae5487e9c.png 437d69e3e000ce81.png

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ụ: dữ liệu tích luỹ như ExerciseSessionRecord.EXERCISE_DURATION_TOTALStepsRecord.COUNT_TOTAL, dữ liệu thống kê như WeightRecord.WEIGHT_AVG, HeartRateRecord.BPM_MAXHeartRateRecord.BPM_MIN.

    /**
     * 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 startTimeendTime 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 bạn có thể xem trọng lượng trung bình trên màn hình Record weight (Ghi lại trọng lượng) hay không. Ngoài ra, để xem dữ liệu chi tiết về một phiên tập thể dục, hãy mở màn hình Exercise sessions (Phiên tập thể dục) rồi nhấn vào một bản ghi phiên tập thể dục.

af1fe646159d6a60.png

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à hoạt động 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à hoạt động thể dục trong hệ sinh thái Health Connect.

Tài liệu đọc thêm