Skip to main content

Overview

The Synheart Wear Kotlin SDK provides native Android support for streaming biometric data from wearables via Health Connect and cloud APIs (WHOOP, Garmin, Fitbit).

Installation

Gradle (Kotlin DSL)

Add JitPack repository to settings.gradle.kts:
maven { url = uri("https://jitpack.io") }
Add dependency to build.gradle.kts:
dependencies {
    implementation("com.github.synheart-ai:synheart-wear-android:0.3.0")
}

Requirements

  • Android SDK API 21+
  • Kotlin 1.8+
  • Health Connect app installed

Quick Start

Initialize SDK

import ai.synheart.wear.SynheartWear
import ai.synheart.wear.config.SynheartWearConfig
import ai.synheart.wear.models.DeviceAdapter

val synheartWear = SynheartWear(
    context = this,
    config = SynheartWearConfig(
        enabledAdapters = setOf(DeviceAdapter.HEALTH_CONNECT)
    )
)

Request Permissions & Initialize

lifecycleScope.launch {
    val permissions = setOf(
        PermissionType.HEART_RATE,
        PermissionType.STEPS,
        PermissionType.CALORIES
    )

    val result = synheartWear.requestPermissions(permissions)

    if (result[PermissionType.HEART_RATE] == ConsentStatus.GRANTED) {
        synheartWear.initialize()
        val metrics = synheartWear.readMetrics()
        Log.d(TAG, "HR: ${metrics.getMetric(MetricType.HR)} bpm")
    }
}

Real-Time Streaming

lifecycleScope.launch {
    synheartWear.streamHR(interval = 5000L).collect { metrics ->
        val hr = metrics.getMetric(MetricType.HR)
        Log.d(TAG, "Current HR: $hr bpm")
    }
}

Platform Configuration

Add to AndroidManifest.xml:
<uses-permission android:name="android.permission.health.READ_HEART_RATE"/>
<uses-permission android:name="android.permission.health.READ_STEPS"/>

<queries>
    <package android:name="com.google.android.apps.healthdata" />
</queries>

BLE Heart Rate Monitor

Connect directly to any standard Bluetooth LE heart rate monitor for real-time HR streaming.

Setup

Add to AndroidManifest.xml:
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

Usage

import ai.synheart.wear.SynheartWear
import ai.synheart.wear.config.SynheartWearConfig
import ai.synheart.wear.models.DeviceAdapter

val synheartWear = SynheartWear(
    context = this,
    config = SynheartWearConfig(
        enabledAdapters = setOf(DeviceAdapter.BLE_HRM)
    )
)

val bleHrm = synheartWear.bleHrm ?: return

// Scan for nearby HR monitors
val devices = bleHrm.scan(timeoutMs = 10000, namePrefix = "WHOOP")

// Connect to a device
bleHrm.connect(deviceId = devices.first().deviceId, sessionId = "my-session")

// Collect heart rate samples
bleHrm.heartRateFlow.collect { sample ->
    Log.d(TAG, "BPM: ${sample.bpm}")
    sample.rrIntervalsMs?.let { rr ->
        Log.d(TAG, "RR: $rr")
    }
}

// Disconnect
bleHrm.disconnect()

Supported Devices

Works with any BLE device implementing the standard Heart Rate Profile (0x180D):
  • WHOOP (Broadcast HR mode)
  • Polar H10, OH1
  • Wahoo TICKR
  • Garmin HRM-Pro / HRM-Dual

Garmin Health SDK (Native RTS)

The GarminHealth facade provides native Garmin device integration for scanning, pairing, and real-time streaming using generic SDK-owned types.
Important: The Garmin Health SDK Real-Time Streaming (RTS) capability requires a separate license from Garmin. This facade is available on demand for licensed integrations. The underlying Garmin Health SDK code is proprietary to Garmin and is not distributed as open source.
import ai.synheart.wear.adapters.GarminHealth

val garmin = GarminHealth(licenseKey = "your-garmin-sdk-key")
garmin.initialize()

// Scan for devices
garmin.scannedDevicesFlow.collect { devices ->
    println("Found ${devices.size} devices")
}

// Pair and read metrics
val paired = garmin.pairDevice(scannedDevice)
val metrics = garmin.readMetrics()
For cloud-based Garmin data (OAuth + webhooks), use GarminProvider instead.

Resources

For comprehensive documentation, see the full README on GitHub.
Author: Israel Goytom