Flutter Blue Plus中GATT_INSUFFICIENT_RESOURCES异常的处理与规避
解决FlutterBluePlus GATT_INSUFFICIENT_RESOURCES异常
异常说明
这是Android蓝牙GATT层的资源不足错误(错误码17),核心原因是同时订阅的BLE特征数量超出系统限制,或蓝牙资源未及时释放导致的。
规避方案
- 限制订阅数量:Android设备对同时开启通知的BLE特征有固定限制(通常4-8个),只保留业务必需的特征订阅,关闭非必要的通知。
- 及时释放资源:不再使用的蓝牙设备立即调用
disconnect()断开连接,对不再需要的特征调用setNotifyValue(false)取消订阅,并清理相关引用。 - 分批订阅:不要一次性批量订阅所有特征,分批次逐步执行订阅操作,每批次间隔300-500毫秒,给系统预留资源释放时间。
- 避免重复订阅:订阅前先检查特征的
isNotifying属性,若已处于通知状态,跳过重复调用。 - 适配设备差异:部分中低端Android设备的蓝牙资源限制更严格,测试时针对目标机型调整订阅策略,比如减少低配置设备的订阅数量。
异常处理(避免应用崩溃)
1. 局部捕获异常
调用setNotifyValue时,用try-catch包裹异步代码,针对性处理资源不足异常:
try { await targetCharacteristic.setNotifyValue(true); } on FlutterBluePlusException catch (e) { if (e.androidCode == 17) { // 处理资源不足情况,比如提示用户或自动释放非关键资源 print("蓝牙资源不足,请关闭部分蓝牙设备连接后重试"); // 可选:取消某个非关键特征的订阅后重试 // await nonCriticalCharacteristic.setNotifyValue(false); // await targetCharacteristic.setNotifyValue(true); } else { // 处理其他FlutterBluePlus异常 } } catch (e) { // 处理其他类型异常 }
2. 全局异常兜底
在应用启动时设置全局异常处理器,捕获未被局部处理的异常,防止应用崩溃:
void main() { // 处理Flutter框架层错误 FlutterError.onError = (FlutterErrorDetails details) { FlutterError.presentError(details); // 可选:上报错误到日志系统 }; // 处理异步任务未捕获的异常 runZonedGuarded(() { runApp(const MyApp()); }, (Object error, StackTrace stackTrace) { if (error is FlutterBluePlusException && (error as FlutterBluePlusException).androidCode == 17) { // 全局处理蓝牙资源不足异常,比如弹出提示 } // 其他全局异常处理逻辑 }); }
3. 重试与降级策略
捕获到资源不足异常后,可自动取消非关键特征的订阅,然后重试当前订阅;或者提示用户手动关闭其他蓝牙设备,再重新执行操作。
内容的提问来源于stack exchange,提问作者Hitesh Bharadwaj
相关产品推荐
相关产品推荐

