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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:52:42