เริ่มต้นใช้งาน Health Connect

คู่มือนี้ใช้ได้กับ Health Connect เวอร์ชัน 1.1.0-alpha12

คู่มือนี้จะแสดงวิธีเริ่มต้นใช้งาน Health Connect ในแอป

ขั้นตอนที่ 1: เตรียมแอป Health Connect

แอป Health Connect มีหน้าที่จัดการคำขอทั้งหมดที่แอปพลิเคชันของคุณส่งผ่าน Health Connect SDK คำขอเหล่านี้รวมถึงการจัดเก็บข้อมูลและการจัดการสิทธิ์เข้าถึงเพื่ออ่านและเขียนข้อมูล

การเข้าถึง Health Connect ขึ้นอยู่กับเวอร์ชัน Android ที่ติดตั้งในโทรศัพท์ ส่วนต่อไปนี้จะอธิบายวิธีจัดการ Android เวอร์ชันล่าสุดหลายเวอร์ชัน

Android 14

ตั้งแต่ Android 14 (API ระดับ 34) เป็นต้นไป Health Connect จะเป็นส่วนหนึ่งของ Android Framework Health Connect เวอร์ชันนี้เป็น โมดูลเฟรมเวิร์ก จึงไม่จำเป็นต้องตั้งค่า

Android 13 ลงไป

ใน Android 13 (API ระดับ 33) และเวอร์ชันที่ต่ำกว่า Health Connect จะไม่ได้เป็นส่วนหนึ่งของ Android Framework ดังนั้นคุณจึงต้องติดตั้ง แอป Health Connect จาก Google Play Store

หากคุณผสานรวมแอปกับ Health Connect ใน Android 13 ลงไปและ ต้องการย้ายข้อมูลใน Android 14 โปรดดู ย้ายข้อมูลจาก Android 13 ไปเป็น 14

เปิดแอป Health Connect

Health Connect จะไม่ปรากฏในหน้าจอหลักโดยค่าเริ่มต้นอีกต่อไป คุณสามารถเปิด Health Connect ผ่าน การตั้งค่า ได้ แม้ว่าเส้นทางจะแตกต่างกันไปตาม เวอร์ชัน Android ดังนี้

  • ใน Android 14 ขึ้นไป: ไปที่การตั้งค่า > ความปลอดภัยและความเป็นส่วนตัว > การควบคุมความเป็นส่วนตัว > Health Connect หรือค้นหา Health Connect ในการตั้งค่า
  • ใน Android 13 ลงไป: ไปที่การตั้งค่า > แอป > Health Connect หรือเพิ่ม Health Connect ลงในเมนูการตั้งค่าด่วน

ขั้นตอนที่ 2: เพิ่ม Health Connect SDK ลงในแอป

Health Connect SDK มีหน้าที่ใช้ Health Connect API เพื่อส่งคำขอในการดำเนินการกับ Datastore ในแอป Health Connect

เพิ่มทรัพยากร Dependency ของ Health Connect SDK ในไฟล์ build.gradle ระดับโมดูล ดังนี้

dependencies {
  ...
  implementation "androidx.health.connect:connect-client:1.2.0-alpha04"
  ...
}

ดูเวอร์ชันล่าสุดได้ที่ Health Connect Releases

ใช้ฟีเจอร์ในเวอร์ชันการเผยแพร่ Canary

หากต้องการใช้ฟีเจอร์ในเวอร์ชันการเผยแพร่ Canary ให้แก้ไขเวอร์ชันของ compileSdk ในไฟล์ build.gradle ระดับโมดูล ดังนี้

android {
  compileSdkPreview = "CANARY"
}

ขั้นตอนที่ 3: กำหนดค่าแอป

ส่วนต่อไปนี้จะอธิบายวิธีกำหนดค่าแอปเพื่อผสานรวมกับ Health Connect

ตรวจสอบความพร้อมใช้งานของฟีเจอร์

เมื่อมีการเพิ่มฟีเจอร์ใหม่ลงใน Health Connect ผู้ใช้อาจไม่อัปเดต Health Connect เป็นเวอร์ชันล่าสุดเสมอไป Feature Availability API เป็นวิธีตรวจสอบว่าฟีเจอร์ใน Health Connect พร้อมใช้งานในอุปกรณ์ของผู้ใช้หรือไม่ และตัดสินใจว่าจะดำเนินการอย่างไร

ฟังก์ชันหลักในการตรวจสอบความพร้อมใช้งานของฟีเจอร์คือ getFeatureStatus() ซึ่งจะแสดงค่าคงที่จำนวนเต็ม FEATURE_STATUS_AVAILABLE หรือ FEATURE_STATUS_UNAVAILABLE

if (healthConnectClient
     .features
     .getFeatureStatus(
       HealthConnectFeatures.FEATURE_READ_HEALTH_DATA_IN_BACKGROUND
     ) == HealthConnectFeatures.FEATURE_STATUS_AVAILABLE) {

  // Feature is available
  ...
} else {
  // Feature is not available
  ...
}

ประกาศสิทธิ์

การเข้าถึงข้อมูลสุขภาพและการออกกำลังกายเป็นเรื่องละเอียดอ่อน Health Connect จึงใช้เลเยอร์ความปลอดภัยสำหรับการดำเนินการอ่านและเขียนข้อมูลเพื่อรักษาความไว้วางใจของผู้ใช้

ในแอป ให้ประกาศสิทธิ์อ่านและเขียนในไฟล์ AndroidManifest.xml ตามประเภทข้อมูลที่จำเป็น ซึ่งควรตรงกับประเภทข้อมูลที่คุณประกาศสิทธิ์เข้าถึงใน Play Console

Health Connect ใช้รูปแบบการประกาศสิทธิ์มาตรฐานของ Android กำหนดสิทธิ์ด้วยแท็ก <uses-permission> โดยวางแท็กเหล่านี้ไว้ภายในแท็ก <manifest>

<manifest>
  <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"/>

  <application>
  ...
  </application>
</manifest>

ดูรายการสิทธิ์ทั้งหมดและประเภทข้อมูลที่เกี่ยวข้องได้ที่ รายการประเภทข้อมูล

แสดงกล่องโต้ตอบนโยบายความเป็นส่วนตัวของแอป

ไฟล์ Manifest ของ Android ต้องมีกิจกรรมที่แสดงนโยบายความเป็นส่วนตัวของแอป ซึ่งเป็นเหตุผลที่แอปขอสิทธิ์ โดยอธิบายวิธีใช้และจัดการข้อมูลของผู้ใช้

ประกาศกิจกรรมนี้เพื่อจัดการ Intent ACTION_SHOW_PERMISSIONS_RATIONALE ซึ่งจะส่งไปยังแอปเมื่อผู้ใช้คลิกลิงก์นโยบายความเป็นส่วนตัว ในหน้าจอขอสิทธิ์ของ Health Connect

...
<application>
  ...
  <!-- For supported versions through Android 13, create an activity to show the rationale
       of Health Connect permissions once users click the privacy policy link. -->
  <activity
      android:name=".PermissionsRationaleActivity"
      android:exported="true">
    <intent-filter>
      <action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE" />
    </intent-filter>
  </activity>

  <!-- For versions starting Android 14, create an activity alias to show the rationale
       of Health Connect permissions once users click the privacy policy link. -->
  <activity-alias
      android:name="ViewPermissionUsageActivity"
      android:exported="true"
      android:targetActivity=".PermissionsRationaleActivity"
      android:permission="android.permission.START_VIEW_PERMISSION_USAGE">
    <intent-filter>
      <action android:name="android.intent.action.VIEW_PERMISSION_USAGE" />
      <category android:name="android.intent.category.HEALTH_PERMISSIONS" />
    </intent-filter>
  </activity-alias>
  ...
</application>
...

รับไคลเอ็นต์ Health Connect

HealthConnectClient เป็นจุดแรกเข้าของ Health Connect API ซึ่งช่วยให้แอปใช้พื้นที่เก็บข้อมูลในแอป Health Connect ได้ โดยจะจัดการการเชื่อมต่อกับเลเยอร์พื้นที่เก็บข้อมูลพื้นฐานโดยอัตโนมัติ รวมถึงจัดการ IPC และการเรียงอันดับคำขอขาออกและการตอบกลับขาเข้าทั้งหมด

หากต้องการรับอินสแตนซ์ไคลเอ็นต์ ให้ประกาศชื่อแพ็กเกจ Health Connect ในไฟล์ Manifest ของ Android ก่อน

<application> ... </application>
...
<!-- Check if Health Connect is installed -->
<queries>
    <package android:name="com.google.android.apps.healthdata" />
</queries>

จากนั้นในกิจกรรม ให้ตรวจสอบว่าได้ติดตั้ง Health Connect แล้วหรือไม่ โดยใช้ getSdkStatus หากติดตั้งแล้ว ให้รับอินสแตนซ์ HealthConnectClient

val availabilityStatus = HealthConnectClient.getSdkStatus(context, providerPackageName)
if (availabilityStatus == HealthConnectClient.SDK_UNAVAILABLE) {
  return // early return as there is no viable integration
}
if (availabilityStatus == HealthConnectClient.SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED) {
  // Optionally redirect to package installer to find a provider, for example:
  val uriString = "market://details?id=$providerPackageName&url=healthconnect%3A%2F%2Fonboarding"
  context.startActivity(
    Intent(Intent.ACTION_VIEW).apply {
      setPackage("com.android.vending")
      data = Uri.parse(uriString)
      putExtra("overlay", true)
      putExtra("callerId", context.packageName)
    }
  )
  return
}
val healthConnectClient = HealthConnectClient.getOrCreate(context)
// Issue operations with healthConnectClient

ขั้นตอนที่ 4: ขอสิทธิ์จากผู้ใช้

หลังจากสร้างอินสแตนซ์ไคลเอ็นต์แล้ว แอปต้องขอสิทธิ์จากผู้ใช้ ผู้ใช้ต้องได้รับอนุญาตให้ให้สิทธิ์หรือปฏิเสธสิทธิ์ได้ทุกเมื่อ

หากต้องการทำเช่นนั้น ให้สร้างชุดสิทธิ์สำหรับประเภทข้อมูลที่จำเป็น ตรวจสอบว่าได้ประกาศสิทธิ์ในชุดในไฟล์ Manifest ของ Android แล้ว

// Create a set of permissions for required data types
val PERMISSIONS =
    setOf(
  HealthPermission.getReadPermission(HeartRateRecord::class),
  HealthPermission.getWritePermission(HeartRateRecord::class),
  HealthPermission.getReadPermission(StepsRecord::class),
  HealthPermission.getWritePermission(StepsRecord::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)
  }
}

เนื่องจากผู้ใช้ให้สิทธิ์หรือเพิกถอนสิทธิ์ได้ทุกเมื่อ แอปจึงต้องตรวจสอบสิทธิ์ทุกครั้งก่อนที่จะใช้สิทธิ์และจัดการสถานการณ์ที่สิทธิ์หายไป

เริ่มต้นใช้งานผู้ใช้

แอปจำนวนมากมีขั้นตอนการเริ่มต้นใช้งานที่กำหนดเอง เช่น การให้ข้อมูลเกี่ยวกับฟีเจอร์หรือการขอความยินยอมจากผู้ใช้ หากต้องการให้ Health Connect เปิดขั้นตอนการเริ่มต้นใช้งาน ให้เพิ่มข้อมูลต่อไปนี้ลงในไฟล์ Manifest

<!-- Required to support pre-Android 14 devices with APK Health Connect -->
<activity
  android:name=".OnboardingActivity"
  android:exported="true"
  android:permission="com.google.android.apps.healthdata.permission.START_ONBOARDING">
  <intent-filter>
    <action android:name="androidx.health.ACTION_SHOW_ONBOARDING"/>
  </intent-filter>
</activity>
<!-- Required to support Android 14+ devices with platform Health Connect -->
<activity-alias
  android:name="UAndAboveOnboardingActivity"
  android:exported="true"
  android:targetActivity=".OnboardingActivity"
  android:permission="android.permission.health.START_ONBOARDING">
  <intent-filter>
    <action android:name="android.health.connect.action.SHOW_ONBOARDING" />
  </intent-filter>
</activity-alias>

ผู้ใช้อาจเริ่มการเชื่อมต่อกับแอปโดยตรงจากแอป Health Connect แทนที่จะเริ่มจากภายในแอป หากแอปต้องมีการโต้ตอบเพิ่มเติมนอกเหนือจากการได้รับสิทธิ์อ่านหรือเขียนข้อมูล ให้ระบุกิจกรรมการเตรียมความพร้อมผู้ใช้งานใหม่

โปรดทราบว่าระบบอาจเปิดใช้งานกิจกรรมการเตรียมความพร้อมผู้ใช้งานใหม่มากกว่า 1 ครั้ง เช่น หากผู้ใช้เพิกถอนสิทธิ์เข้าถึงแอปในภายหลังแล้วเชื่อมต่อแอปอีกครั้ง

ขั้นตอนที่ 5: ดำเนินการ

เมื่อตั้งค่าทุกอย่างเรียบร้อยแล้ว ให้ดำเนินการอ่านและเขียนข้อมูลในแอป

ผู้ใช้อาจใช้แอปอื่นๆ ที่ซิงค์ข้อมูลกับ Health Connect เพื่อให้แอปของคุณเข้าถึงได้ หากผู้ใช้ยังไม่ได้ตั้งค่าแอปเหล่านี้ให้เขียนข้อมูลลงใน Health Connect คุณสามารถใช้ Matchmaking API เพื่อเชื่อมต่อแอปเหล่านี้ให้กับผู้ใช้ได้อย่างราบรื่น

เขียนข้อมูล

จัดโครงสร้างข้อมูลเป็นระเบียน ดูรายการ ประเภทข้อมูลที่ใช้ได้ใน Health Connect

val stepsRecord = StepsRecord(
    count = 120,
    startTime = START_TIME,
    endTime = END_TIME,
    startZoneOffset = START_ZONE_OFFSET,
    endZoneOffset = END_ZONE_OFFSET,
)

จากนั้นเขียนระเบียนโดยใช้ insertRecords

suspend fun insertSteps(healthConnectClient: HealthConnectClient) {
    val endTime = Instant.now()
    val startTime = endTime.minus(Duration.ofMinutes(15))
    try {
        val stepsRecord = StepsRecord(
            count = 120,
            startTime = startTime,
            endTime = endTime,
            startZoneOffset = ZoneOffset.UTC,
            endZoneOffset = ZoneOffset.UTC,
            metadata = Metadata.autoRecorded(
                device = Device(type = Device.TYPE_WATCH)
            ),
        )
        healthConnectClient.insertRecords(listOf(stepsRecord))
    } catch (e: Exception) {
        // Run error handling here
    }
}

อ่านข้อมูล

คุณสามารถอ่านข้อมูลทีละรายการโดยใช้ readRecords

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

นอกจากนี้ คุณยังอ่านข้อมูลในลักษณะที่รวบรวมได้โดยใช้ aggregate

suspend fun aggregateSteps(
    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
    }
}

วิดีโอแนะนำ

ดูวิดีโอต่อไปนี้ที่อธิบายเพิ่มเติมเกี่ยวกับฟีเจอร์ของ Health Connect รวมถึงหลักเกณฑ์แนวทางปฏิบัติแนะนำสำหรับการผสานรวมอย่างราบรื่น

แหล่งข้อมูล

ดูแหล่งข้อมูลต่อไปนี้ที่จะช่วยในการพัฒนาในภายหลัง

ขั้นตอนถัดไป

ดูเวิร์กโฟลว์ทั่วไป เพื่อดูวิธีดำเนินการใน Health Connect เช่น