Mengembangkan Pengalaman Vitalitas dengan Health Connect

Jika Anda ingin membuat aplikasi yang mengelola data 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 vital yang direkam oleh aplikasi atau perangkat terhubung
  • Memantau tren dan memberikan insight kesehatan berdasarkan data tanda vital

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

Ringkasan: Membuat Pelacak Vitals yang Komprehensif

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

  • Meminta izin yang sesuai untuk jenis data vitalitas.
  • Menulis data tanda vital menggunakan rekaman seperti BloodPressureRecord, HeartRateRecord, dan rekaman tanda vital lainnya.
  • Membaca data tanda vital untuk ditampilkan, dianalisis, atau disinkronkan.
  • Menggunakan batching 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 penting:

Konsep utama

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

Jenis data vitalitas

Data penting diwakili oleh setiap jenis catatan. Jenis yang umum meliputi:

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

Pertimbangan pengembangan

Data 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 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 menunjukkan 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 perlu 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 vital ke Health Connect. Data vital biasanya ditulis sebagai catatan individual. Jika Anda menulis beberapa catatan sekaligus, seperti menyinkronkan dari sensor atau backend, gunakan batching.

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 rekaman sekaligus secara 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 penting untuk menampilkan pengukuran, menganalisis tren, atau menyinkronkan data dengan server eksternal. Untuk membaca data penting, gunakan ReadRecordsRequest dengan jenis data tertentu dan filter menurut rentang waktu.

Contoh membaca 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 vital dengan server backend, atau menjaga datastore aplikasi Anda tetap terbaru dengan Health Connect, gunakan ChangeLogs. Dengan demikian, Anda dapat mengambil daftar data yang disisipkan, diperbarui, atau dihapus sejak waktu tertentu, yang lebih efisien daripada melacak perubahan secara manual atau berulang kali membaca semua data. Untuk mengetahui informasi selengkapnya, lihat Menyinkronkan data dengan Health Connect.

Praktik terbaik

Ikuti panduan berikut untuk meningkatkan keandalan data dan pengalaman pengguna:

  • Permintaan penulisan batch: Untuk mengurangi overhead Input/Output dan menghemat masa pakai baterai, kelompokkan titik data ke dalam satu panggilan insertRecords dengan batch hingga 1.000 rekaman, bukan menulis setiap titik satu per satu.
  • Menulis data secara sering selama pelacakan langsung: Untuk pembaruan yang sering dari sensor (seperti alat pemantau glukosa berkelanjutan atau alat pemantau detak jantung), tulis data dalam batch dengan interval hingga 15 menit untuk menyeimbangkan pembaruan 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. Targetkan interval 15 menit untuk penulisan batch.
  • Hindari penulisan data duplikat: Gunakan ID Klien: Saat membuat rekaman, tetapkan metadata.clientRecordId. Health Connect menggunakan 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, kueri Health Connect untuk melihat apakah data dari aplikasi Anda sudah ada dalam rentang waktu sinkronisasi, 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.'
  • Menyelaraskan stempel waktu dengan pengukuran: Pastikan stempel waktu rekaman secara akurat mencerminkan waktu pengukuran dilakukan. Untuk data interval seperti HeartRateRecord, pastikan startTime dan endTime sudah benar.

Pengujian

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

Alat verifikasi

  • Toolbox Health Connect: Gunakan aplikasi pendamping ini untuk memeriksa catatan secara manual, menghapus data pengujian, dan menyimulasikan perubahan pada database. Cara ini adalah cara terbaik untuk memverifikasi bahwa catatan 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

Penerapan data vital biasanya mencakup:

Komponen Mengelola
Pengontrol tanda vital Pembacaan Sensor/Input
Logika pengelompokan
Lapisan repositori (membungkus 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 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.
Record duplikat muncul clientRecordId tidak ada. Tetapkan clientRecordId unik di Metadata setiap rekaman. 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 Satuan 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 tipe data untuk mengetahui rentang dan unit yang valid.

Langkah-langkah umum untuk men-debug

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