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
相关产品推荐
相关产品推荐

