Mengembangkan Pengalaman Vitalitas dengan Health Connect

Panduan ini kompatibel dengan Health Connect versi 1.1.0 atau yang lebih baru.

Jika Anda ingin membuat aplikasi yang mengelola tanda vital pengguna, Anda dapat menggunakan Health Connect untuk melakukan hal-hal seperti:

  • Membaca data tanda vital seperti tekanan darah, detak jantung, dan suhu tubuh dari aplikasi lain
  • Menulis data tanda vital yang direkam oleh aplikasi atau perangkat terhubung Anda
  • Memantau tren dan memberikan insight kesehatan berdasarkan data tanda vital

Panduan ini menjelaskan cara menggunakan jenis data vital, yang mencakup izin, alur kerja baca dan tulis, serta praktik terbaik.

Ringkasan: Membangun Pelacak Tanda Vital yang Komprehensif

Anda dapat membangun pengalaman pelacakan tanda vital yang komprehensif menggunakan Health Connect dengan mengikuti langkah-langkah inti berikut:

  • Meminta izin yang sesuai untuk jenis data tanda vital.
  • Menulis data tanda vital menggunakan data seperti BloodPressureRecord, HeartRateRecord, dan data tanda vital lainnya.
  • Membaca data tanda vital untuk ditampilkan, dianalisis, atau disinkronkan.
  • Menggunakan pengelompokan untuk penulisan dan pembacaan data yang efisien.

Alur kerja ini memungkinkan interoperabilitas dengan aplikasi Health Connect lainnya dan memverifikasi akses data yang dikontrol pengguna.

Sebelum memulai

Sebelum menerapkan fitur vitals:

Konsep utama

Data tanda vital di Health Connect diwakili oleh berbagai jenis data, yang masing-masing sesuai dengan pengukuran fisiologis tertentu. Tidak seperti sesi olahraga, data vital sering kali dicatat sebagai data titik waktu atau berbasis interval.

Jenis data tanda vital

Data tanda vital diwakili oleh setiap jenis data. Jenis yang umum meliputi:

Untuk mengetahui daftar lengkap jenis data, lihat Jenis data Health Connect.

Pertimbangan pengembangan

Data tanda vital dapat bersifat sensitif, dan aplikasi mungkin perlu menulis data sebagai respons terhadap pengukuran dari sensor atau input pengguna, atau menyinkronkan data dari backend. Izin sangat penting untuk menangani data tanda vital.

Izin

Aplikasi Anda harus meminta izin Health Connect yang relevan sebelum membaca atau menulis data tanda vital. Izin umum untuk tanda vital mencakup tekanan darah, detak jantung, suhu tubuh, glukosa darah, saturasi oksigen, dan laju pernapasan. Ini mencakup hal-hal berikut:

Berikut adalah contoh cara meminta izin untuk tekanan darah, detak jantung, dan suhu tubuh:

Setelah membuat instance klien, aplikasi Anda perlu meminta izin dari pengguna. Pengguna harus diizinkan untuk memberikan atau menolak izin kapan saja. Untuk melakukannya, buat kumpulan izin untuk jenis data yang diperlukan. Pastikan izin dalam kumpulan dideklarasikan dalam manifes Android Anda terlebih dahulu.

val permissions =
    setOf(
        HealthPermission.getReadPermission(BloodPressureRecord::class),
        HealthPermission.getWritePermission(BloodPressureRecord::class),
        HealthPermission.getReadPermission(HeartRateRecord::class),
        HealthPermission.getWritePermission(HeartRateRecord::class),
        HealthPermission.getReadPermission(BodyTemperatureRecord::class),
        HealthPermission.getWritePermission(BodyTemperatureRecord::class)
    )
Gunakan getGrantedPermissions untuk mengetahui apakah aplikasi Anda sudah mendapatkan izin yang diperlukan. Jika belum, gunakan createRequestPermissionResultContract untuk meminta izin tersebut. Tindakan ini akan menampilkan layar izin Health Connect.
val permissions = setOf(
        HealthPermission.getReadPermission(StepsRecord::class),
        HealthPermission.getWritePermission(StepsRecord::class),
        HealthPermission.getReadPermission(HeartRateRecord::class),
        HealthPermission.getWritePermission(HeartRateRecord::class)
    )

val requestPermissionsLauncher = rememberLauncherForActivityResult(
    contract = PermissionController.createRequestPermissionResultContract()
) { grantedPermissions ->
    if (grantedPermissions.containsAll(permissions)) {
        coroutineScope.launch { snackbarHostState.showSnackbar("Permissions granted!") }
    } else {
        coroutineScope.launch { snackbarHostState.showSnackbar("Permissions denied.") }
    }
}
Karena pengguna dapat memberikan atau mencabut izin kapan saja, aplikasi Anda harus memeriksa izin setiap kali sebelum menggunakannya dan menangani skenario saat izin hilang.

Untuk meminta izin, panggil fungsi checkPermissionsAndRun:

if (!granted.containsAll(permissions)) {
    // Check if required permissions are not granted, and return
    return emptySet()
}
// Permissions already granted; proceed with inserting or reading data

Jika Anda hanya perlu meminta izin untuk satu jenis data, seperti tekanan darah, sertakan hanya jenis data tersebut dalam set izin Anda:

Akses ke tekanan darah dilindungi oleh izin berikut:

  • android.permission.health.READ_BLOOD_PRESSURE
  • android.permission.health.WRITE_BLOOD_PRESSURE

Untuk menambahkan kemampuan tekanan darah ke aplikasi Anda, mulailah dengan meminta izin untuk jenis data BloodPressureRecord.

Berikut adalah izin yang harus Anda deklarasikan agar dapat menulis tekanan darah:

<application>
  <uses-permission
android:name="android.permission.health.WRITE_BLOOD_PRESSURE" />
...
</application>

Untuk membaca tekanan darah, Anda perlu meminta izin berikut:

<application>
  <uses-permission
android:name="android.permission.health.READ_BLOOD_PRESSURE" />
...
</application>

Menulis data tanda vital

Bagian ini menjelaskan cara menulis data tanda vital ke Health Connect. Data tanda vital biasanya ditulis sebagai data individual. Jika Anda menulis beberapa data sekaligus, seperti menyinkronkan dari sensor atau backend, gunakan pengelompokan.

Contoh penulisan BloodPressureRecord:

suspend fun writeBloodPressureRecord(healthConnectClient: HealthConnectClient) {
    val record = BloodPressureRecord(
        time = Instant.now(),
        zoneOffset = ZoneOffset.UTC,
        systolic = Pressure.millimetersOfMercury(120.0),
        diastolic = Pressure.millimetersOfMercury(80.0),
        bodyPosition = BloodPressureRecord.BODY_POSITION_SITTING_DOWN,
        measurementLocation = BloodPressureRecord.MEASUREMENT_LOCATION_LEFT_WRIST
    )
    healthConnectClient.insertRecords(listOf(record))
}

Penulisan batch

Jika aplikasi Anda perlu menulis beberapa titik data, seperti menyinkronkan data dari perangkat terhubung atau layanan backend, Anda harus mengelompokkan penulisan untuk meningkatkan efisiensi dan mengurangi konsumsi baterai. Health Connect dapat menangani hingga 1.000 data dalam satu permintaan tulis.

Kode berikut menunjukkan cara menulis beberapa data sekaligus dalam batch:

suspend fun writeBatchRecords(healthConnectClient: HealthConnectClient) {
    val bloodPressureRecord = BloodPressureRecord(
        time = Instant.now(),
        zoneOffset = ZoneOffset.UTC,
        systolic = Pressure.millimetersOfMercury(120.0),
        diastolic = Pressure.millimetersOfMercury(80.0),
        bodyPosition = BloodPressureRecord.BODY_POSITION_SITTING_DOWN,
        measurementLocation = BloodPressureRecord.MEASUREMENT_LOCATION_LEFT_WRIST
    )
    val heartRateRecord = HeartRateRecord(
        startTime = Instant.now().minusSeconds(60),
        startZoneOffset = ZoneOffset.UTC,
        endTime = Instant.now(),
        endZoneOffset = ZoneOffset.UTC,
        samples = listOf(HeartRateRecord.Sample(time = Instant.now().minusSeconds(30), beatsPerMinute = 80))
    )
    healthConnectClient.insertRecords(listOf(bloodPressureRecord, heartRateRecord))
}

Membaca data tanda vital

Aplikasi dapat membaca data tanda vital untuk menampilkan pengukuran, menganalisis tren, atau menyinkronkan data dengan server eksternal. Untuk membaca tanda vital, gunakan ReadRecordsRequest dengan jenis data tertentu dan filter menurut rentang waktu.

Contoh pembacaan data BloodPressureRecord:

suspend fun readBloodPressureRecords(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant
) {
    val response = healthConnectClient.readRecords(
        ReadRecordsRequest(
            recordType = BloodPressureRecord::class,
            timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
        )
    )

    for (record in response.records) {
        // Process each blood pressure record
        val systolic = record.systolic
        val diastolic = record.diastolic
    }
}

Jika Anda perlu menyinkronkan data tanda vital dengan server backend, atau terus mengupdate datastore aplikasi dengan Health Connect, gunakan ChangeLogs. Dengan begitu, Anda dapat mengambil daftar data yang disisipkan, diperbarui, atau dihapus sejak waktu tertentu, yang lebih efisien daripada melacak perubahan secara manual atau membaca semua data berulang kali. Untuk mengetahui informasi selengkapnya, lihat Menyinkronkan data dengan Health Connect.

Praktik terbaik

Ikuti panduan ini untuk meningkatkan keandalan data dan pengalaman pengguna:

  • Permintaan tulis batch: Untuk mengurangi overhead Input/Output dan menghemat masa pakai baterai, kelompokkan titik data ke dalam satu panggilan insertRecords dengan batch hingga 1.000 data, daripada menulis setiap titik satu per satu.
  • Tulis data secara berkala selama pelacakan langsung: Untuk update rutin dari sensor (seperti alat pemantau glukosa berkelanjutan atau alat pemantau detak jantung), tulis data dalam batch dengan interval hingga 15 menit untuk menyeimbangkan update real-time dengan efisiensi baterai.
  • Gunakan WorkManager untuk sinkronisasi latar belakang: Gunakan WorkManager untuk penulisan yang ditangguhkan, seperti menyinkronkan data dari perangkat pendamping atau layanan backend. Usahakan interval 15 menit untuk penulisan batch.
  • Menghindari penulisan data duplikat: Gunakan Client ID: Saat membuat data, tetapkan metadata.clientRecordId. Health Connect menggunakan ID ini untuk mengidentifikasi data unik. Jika Anda mencoba menulis data dengan clientRecordId yang sudah ada, Health Connect akan mengabaikan duplikat atau memperbarui data yang ada, bukan membuat data baru. Menetapkan metadata.clientRecordId adalah cara paling efektif untuk mencegah duplikat selama percobaan ulang sinkronisasi atau penginstalan ulang aplikasi.
    val record = StepsRecord(
        count = 100,
        startTime = startTime,
        endTime = endTime,
        startZoneOffset = ZoneOffset.UTC,
        endZoneOffset = ZoneOffset.UTC,
        metadata = Metadata(
            // Use a unique ID from your own database
            clientRecordId = "daily_steps_2023_10_27_user_123"
        )
    )
  • Periksa data yang ada: Sebelum menyinkronkan data, buat kueri Health Connect untuk data dalam rentang waktu sinkronisasi guna melihat apakah data dari aplikasi Anda sudah ada, untuk menghindari duplikat atau menimpa data yang lebih baru.
  • Berikan alasan yang jelas untuk izin: Gunakan alur Permission.createIntent untuk menjelaskan alasan aplikasi Anda memerlukan akses ke data kesehatan, misalnya: 'Untuk memantau tren tekanan darah Anda dan memberikan insight'.
  • Selaraskan stempel waktu dengan pengukuran: Pastikan stempel waktu data mencerminkan secara akurat waktu pengukuran dilakukan. Untuk data interval seperti HeartRateRecord, verifikasi bahwa startTime dan endTime sudah benar.

Pengujian

Untuk memverifikasi kebenaran data dan pengalaman pengguna yang berkualitas tinggi, ikuti strategi pengujian ini dan lihat dokumentasi resmi Menguji kasus penggunaan teratas.

Alat verifikasi

  • Toolbox Health Connect: Gunakan aplikasi pendamping ini untuk memeriksa data secara manual, menghapus data pengujian, dan menyimulasikan perubahan pada database. Ini adalah cara terbaik untuk memverifikasi bahwa data Anda disimpan dengan benar.
  • Pengujian unit dengan FakeHealthConnectClient: Gunakan library pengujian untuk memverifikasi cara aplikasi Anda menangani kasus ekstrem, seperti pencabutan izin atau pengecualian API tanpa memerlukan perangkat fisik.

Checklist kualitas

Arsitektur umum

Implementasi data vital biasanya mencakup:

Komponen Mengelola
Pengontrol tanda vital Pembacaan sensor/input
Logika pengelompokan
Lapisan repositori (menggabungkan operasi Health Connect:) Menyisipkan data tanda vital
Membaca data tanda vital
Lapisan UI (Tampilan): Pembacaan langsung
Data historis
Diagram dan tren

Pemecahan masalah

Gejala Kemungkinan penyebab Resolusi
Jenis data yang tidak ada (Misalnya, Tekanan Darah) Izin tulis tidak ada atau filter waktu salah. Pastikan Anda telah meminta dan pengguna telah memberikan izin jenis data tertentu. Pastikan ReadRecordsRequest Anda menggunakan TimeRangeFilter yang mencakup waktu pengukuran. Lihat Izin.
Data duplikat muncul clientRecordId tidak ada. Tetapkan clientRecordId unik di Metadata setiap data. Hal ini memungkinkan Health Connect melakukan penghapusan duplikat jika data yang sama ditulis dua kali selama percobaan ulang sinkronisasi. Lihat Praktik terbaik.
Data gagal ditulis Unit atau nilai salah di luar rentang yang valid. Health Connect memvalidasi nilai data. Misalnya, nilai tekanan darah harus berada dalam rentang yang masuk akal secara fisiologis. Periksa dokumentasi jenis data untuk mengetahui rentang dan unit yang valid.

Langkah-langkah proses debug umum

Memeriksa status izin. Selalu panggil getPermissionStatus() sebelum mencoba operasi baca atau tulis. Pengguna dapat mencabut izin di setelan sistem kapan saja.