如何在Kotlin安卓应用中获取小米手环9 Active实时心率与步数?
小米手环9 Active 实时数据获取(Kotlin 安卓实现指南)
1. BLE通信:Kotlin 连接手环的实现
基础步骤(原生BLE API)
首先在AndroidManifest.xml中申请必要权限(适配不同Android版本):
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" /> <uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
用Kotlin实现扫描与连接的核心代码:
// 初始化BLE适配器 val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager val bluetoothAdapter = bluetoothManager.adapter // 扫描设备 val scanner = bluetoothAdapter.bluetoothLeScanner val scanCallback = object : ScanCallback() { override fun onScanResult(callbackType: Int, result: ScanResult) { super.onScanResult(callbackType, result) // 通过设备名称过滤小米手环9 Active if (result.device.name?.contains("Mi Band 9 Active") == true) { scanner.stopScan(this) connectToDevice(result.device) } } } // 权限检查后启动扫描 if (ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_SCAN) == PackageManager.PERMISSION_GRANTED) { scanner.startScan(scanCallback) } // 连接设备并发现服务 private fun connectToDevice(device: BluetoothDevice) { val gattCallback = object : BluetoothGattCallback() { override fun onConnectionStateChange(gatt: BluetoothGatt?, status: Int, newState: Int) { super.onConnectionStateChange(gatt, status, newState) if (newState == BluetoothProfile.STATE_CONNECTED) { gatt?.discoverServices() } } override fun onServicesDiscovered(gatt: BluetoothGatt?, status: Int) { super.onServicesDiscovered(gatt, status) if (status == BluetoothGatt.GATT_SUCCESS) { // 服务发现完成,可开始查找目标特征 } } } device.connectGatt(this, false, gattCallback) }
推荐库
- RxAndroidBle:用响应式编程简化BLE操作,适配Kotlin协程,减少回调嵌套。
- Android BLE Library:封装了常见BLE流程,提供更简洁的调用API。
2. 实时心率数据的UUID
小米手环9 Active支持标准BLE心率服务,对应UUID:
- 心率服务UUID:
0000180d-0000-1000-8000-00805f9b34fb - 心率测量特征UUID:
00002a37-0000-1000-8000-00805f9b34fb - 客户端特征配置UUID(用于开启实时通知):
00002902-0000-1000-8000-00805f9b34fb
找到特征后调用setCharacteristicNotification开启通知,在onCharacteristicChanged回调中解析字节数组:第一个字节为标志位,后续数值即为实时心率。
3. 步数统计的UUID
小米手环的步数数据在自定义BLE服务中,常用UUID组合:
- 自定义服务UUID:
0000fee0-0000-1000-8000-00805f9b34fb - 步数数据特征UUID:
0000fee1-0000-1000-8000-00805f9b34fb
注意:步数为自定义字节格式,需参考开源项目(如Gadgetbridge)的解析逻辑,通常从字节数组中提取4字节无符号整数作为步数数值。
4. 设备专属SDK vs 原生BLE实现
- 原生BLE直接实现:完全可行,但需处理小米的自定义协议(如数据加密、指令交互),开发周期长,需参考Gadgetbridge等开源项目的细节。
- 第三方库(如Gadgetbridge):已完成小米手环9 Active的适配,包含完整的BLE连接、数据解析逻辑。可直接参考源码或集成核心模块,大幅节省开发时间。
- 小米官方SDK:提供Mi Fit相关接口,但需申请开发者权限,API封闭性强,自定义空间有限。
总结:快速实现优先参考Gadgetbridge;需完全自定义则用原生BLE配合开源项目的UUID与解析逻辑。
内容的提问来源于stack exchange,提问作者이현구
相关产品推荐
相关产品推荐

