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 tanda vital.
  • 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 latihan fisik, vitalitas sering kali direkam sebagai data berbasis titik waktu atau interval.

Jenis data vitalitas

Data vital diwakili oleh setiap jenis catatan. Jenis umum mencakup:

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. Hal tersebut meliputi:

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

// Create a set of permissions for required data types
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.

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

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)) {
    requestPermissions.launch(PERMISSIONS)
    // Check if required permissions are not granted, and return
  }
// 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 penting biasanya ditulis sebagai catatan individual. Jika Anda menulis beberapa data 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 yang 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 tetap terbaru dengan Health Connect, gunakan ChangeLogs. Dengan demikian, Anda dapat mengambil daftar data yang disisipkan, diperbarui, atau dihapus sejak titik 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 berikut untuk meningkatkan keandalan data dan pengalaman pengguna:

  • Frekuensi penulisan dan pengelompokan: Untuk mengurangi overhead Input/Output dan mempertahankan masa pakai baterai, kelompokkan titik data ke dalam satu panggilan insertRecords dengan batch hingga 1.000 rekaman, daripada menulis setiap titik satu per satu.
    • Pelacakan Langsung: Untuk pembaruan yang sering dari sensor (seperti alat pemantau glukosa berkelanjutan atau alat pemantau detak jantung), tulis data dalam batch pada interval hingga 15 menit untuk menyeimbangkan pembaruan real-time dengan efisiensi baterai.
    • 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 ID Klien Saat membuat catatan, tetapkan metadata.clientRecordId. Health Connect menggunakan ini untuk mengidentifikasi catatan 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 = 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,
        metadata = Metadata(
            // Use a unique ID from your own database
            clientRecordId = "bp_20240101_user123"
        )
    )
  • 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, seperti "Untuk memantau tren tekanan darah Anda dan memberikan insight".

  • Menyelaraskan stempel waktu dengan pengukuran: Verifikasi 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 Uji 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 metrik penting 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 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 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 proses penelusuran kesalahan

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