You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android BLE配对健康设备:实现应用重启后的自动重连方案

实现BLE健康设备的跨会话自动重连方案

针对你提到的场景——已经配对过BLE健康设备,需要在APP退出、安卓设备重启后重新打开APP时自动重连(而传统HDP模式下系统会自动完成这个操作),我整理了一套可行的实现方案:

1. 持久化存储已配对设备的关键标识

每次成功配对或连接上健康设备后,一定要把设备的MAC地址(唯一不变的标识)持久化保存下来,比如用SharedPreferences或者本地数据库。这样APP重启后才能明确知道要连接哪台设备。

示例代码(Kotlin):

// 存储已配对健康设备的MAC地址
val blePrefs = getSharedPreferences("HealthBLEPrefs", Context.MODE_PRIVATE)
blePrefs.edit()
    .putString("LAST_PAIRED_MAC", connectedDevice.address)
    .apply()

2. APP启动时触发自动重连流程

在APP的入口页面(比如MainActivity的onCreate方法),先读取存储的MAC地址,如果存在,直接发起BLE连接请求,不用让用户手动操作。

这里要注意:

  • 确保已经获取了位置权限(安卓6+需要ACCESS_FINE_LOCATION才能扫描/连接BLE设备)
  • 可以通过设备的GATT服务UUID过滤(比如心率设备的0x180D),确保只连接健康类设备

示例代码:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val blePrefs = getSharedPreferences("HealthBLEPrefs", Context.MODE_PRIVATE)
    val pairedMac = blePrefs.getString("LAST_PAIRED_MAC", null)

    pairedMac?.let { mac ->
        val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
        // 通过MAC地址获取远程设备实例
        val targetDevice = bluetoothAdapter.getRemoteDevice(mac)
        // 发起GATT连接,传入自定义的GattCallback处理连接状态
        targetDevice.connectGatt(this, false, healthGattCallback)
    }
}

3. 处理连接失败的重试逻辑

有时候设备可能不在范围内或未开机,第一次连接会失败,这时候可以加个重试机制,提升用户体验。

在BluetoothGattCallback的连接状态回调里处理:

private val healthGattCallback = object : BluetoothGattCallback() {
    override fun onConnectionStateChange(gatt: BluetoothGatt?, status: Int, newState: Int) {
        super.onConnectionStateChange(gatt, status, newState)
        when (newState) {
            BluetoothProfile.STATE_CONNECTED -> {
                // 连接成功,开始发现设备服务
                gatt?.discoverServices()
            }
            BluetoothProfile.STATE_DISCONNECTED -> {
                // 连接失败,判断是否是异常断开,尝试重试
                if (status != BluetoothGatt.GATT_SUCCESS) {
                    // 延迟3秒后重试连接,最多重试3次(可根据需求调整)
                    Handler(Looper.getMainLooper()).postDelayed({
                        gatt?.connect()
                    }, 3000)
                }
            }
        }
    }
}

4. 额外注意事项

  • 安卓10+权限限制:获取BLE设备MAC地址需要ACCESS_FINE_LOCATION权限,后台扫描还需要ACCESS_BACKGROUND_LOCATION,记得在代码里做好权限申请和用户引导。
  • 设备验证:连接成功后,检查设备的GATT服务UUID,确保是你适配的健康设备,避免误连其他BLE设备。
  • 配对解除处理:当用户手动在系统设置里解除设备配对时,要及时清空存储的MAC地址,避免无效的重连尝试。

内容的提问来源于stack exchange,提问作者Brian Reinhold

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:29:21