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

1. Giới thiệu

e4a4985ad1cdae8b.png

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à thể hình 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à thể hình 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 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ể 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 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 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ề 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

  • 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

Cài đặt Health Connect

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

633ed0490a74595d.png

Nhận mã mẫu

Nếu đã cài đặt git, bạn chỉ cần chạy lệnh dưới đây để sao chép mã từ kho lưu trữ này. Để kiểm tra xem git đã được cài đặt hay chưa, hãy nhập git --version vào dòng lệnh hoặc cửa sổ dòng lệnh và xác minh rằng git thực thi đúng cách.

git clone https://github.com/android/android-health-connect-codelab.git
cd android-health-connect-codelab

Nếu không có git, bạn có thể nhấp vào nút sau đây để tải tất cả mã dành cho lớp học lập trình này:

Thư mục mã mẫu chứa mã startfinished 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ã bắt đầ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: 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 đế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ả 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.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 AndroidManifest.xml:

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

Chạy dự án

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.

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 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 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 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 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 -->
<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 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 đó.

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 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.

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 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 Data and access -> Body measurements -> Weight -> See all entries (Dữ liệu và quyền truy cập -> Số đo cơ thể -> Cân nặng -> Xem tất 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. 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 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ể đọc và ghi dữ liệu trực tiếp vào Health Connect, nhờ vậy bạn có thể 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

Giải nén thư mục ZIP để nhận các tệp APK. Sau đó, để cài đặt APK Toolbox trên thiết bị đã kết nối, hãy sử dụng adb. Chuyển đến thư mục chứa tệp APK và chạy lệnh sau:

$ 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ể 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.

Đối với việc kiểm thử, để quản lý quyền đọc và quyền ghi dữ liệu, bạn có thể mở ứng dụng Health Connect từ màn hình chính của ứng dụng Toolbox hoặc trực tiếp chuyển đến quy trình cấp quyền.

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 của Hộp công cụ Health Connect. Tiếp theo, hãy nhấp vào biểu tượng tìm kiếm1f407c55884bb8c3.png trong trình đơn lớp phủ để mở hộp thoại, chọn loại dữ liệu (chẳng hạn như cân nặng) rồi nhấp vào 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. Sau đó, chọn loại dữ liệu. Hãy chèn một dữ liệu về cân nặ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ề 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.

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 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()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,
          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 trả về danh sách các thay đổi đã quan sát được từ Health Connect, chẳng hạn như UpsertionChangeDeletionChange.

  /**
   * 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.

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ụ: ExerciseSessionRecord.EXERCISE_DURATION_TOTALStepsRecord.COUNT_TOTAL cung cấp dữ liệu tích luỹ, trong khi WeightRecord.WEIGHT_AVG, HeartRateRecord.BPM_MAXHeartRateRecord.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 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 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.

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