Flutter实现手机蓝牙外设:解决连接断开与无连接感知问题
解决Flutter蓝牙外设连接问题的正确实现方式
1. 替换轮询,监听连接状态回调
不要用定时轮询isConnected,这个值的更新可能存在延迟或未同步问题。直接使用插件提供的连接状态监听回调,才能准确捕获连接/断开事件:
// 初始化时注册连接状态监听 FlutterBluePeripheral.instance.connectionState.listen((state) { switch (state) { case BluetoothConnectionState.connected: print("设备已连接"); // 处理连接后的业务逻辑 break; case BluetoothConnectionState.disconnected: print("设备已断开"); // 处理断开后的重置逻辑 break; } });
2. 优化广播参数,避免自动断开
你的广播参数缺少广播间隔和广播模式配置,Android系统默认配置可能导致连接超时。调整参数确保连接稳定性:
final AdvertiseSetParameters advertiseSetParameters = AdvertiseSetParameters( scannable: true, connectable: true, txPowerLevel: txPowerHigh, includeTxPowerLevel: true, // 设置中等广播间隔,平衡功耗与连接稳定性 interval: AdvertiseInterval.medium, // 使用低延迟模式,保证连接响应速度 advertiseMode: AdvertiseMode.lowLatency, // 设置为0禁用自动超时,保持持续广播 timeout: 0, );
3. 必须配置GATT服务与特征
仅开启广播但未提供GATT服务的话,连接后会因无数据交互被系统强制断开(通常30秒左右)。添加至少一个基础的GATT服务和特征:
// 定义服务和特征的UUID final Guid serviceUuid = Guid("0000FFE0-0000-1000-8000-00805F9B34FB"); final Guid characteristicUuid = Guid("0000FFE1-0000-1000-8000-00805F9B34FB"); // 创建可读写+通知的特征 final BluetoothCharacteristic characteristic = BluetoothCharacteristic( uuid: characteristicUuid, properties: CharacteristicProperties.read | write | notify, permissions: AttributePermissions.readable | AttributePermissions.writeable, ); // 创建GATT服务 final BluetoothService service = BluetoothService( uuid: serviceUuid, characteristics: [characteristic], ); // 启动广播前添加服务 await FlutterBluePeripheral.instance.addService(service); // 启动广播 await FlutterBluePeripheral.instance.startAdvertising( advertiseSetParameters, AdvertiseData( serviceUuids: [serviceUuid], localName: "MyFlutterPeripheral", ), );
4. 处理Android权限与后台限制
Android 12+需要在AndroidManifest.xml中添加以下权限:
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 后台运行需添加(适配Android 12及以下) --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" android:maxSdkVersion="32" />
若应用需要在后台保持BLE连接,建议启动前台服务,避免系统因资源回收中断连接。
内容的提问来源于stack exchange,提问作者tamptek
相关产品推荐
相关产品推荐

