这里是记录开发过程中可能出现的问题,或者遗漏的操作。
具体 flutter_blue 接入步骤,后期我整理好代码,会专门开一篇文章,一步一步搭建蓝牙通讯。
问题1.权限问题
Android:
添加蓝牙/定位权限
文件地址:Flutter项目文件夹/android/app/src/main/java/AndroidManifest.xml
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION"/>
iOS:
添加蓝牙权限
文件地址:Flutter项目文件夹/ios/Runner/Info.plist
<key>NSBluetoothAlwaysUsageDescription</key>
<string>App需要您的同意,才能访问蓝牙</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>App需要您的同意,才能访问蓝牙</string>
问题2
运行Flutter 在Android端安装的时候Androidstudio提示这个错误:
Suggestion: use a compatible library with a minSdk of at most 16, or increase this project's minSdk
原因:出现这个错误的原因是我引入的第三方库最低支持版本高于我的项目的最低支持版本,异常中的信息显示:我的项目的最低支持版本为,而第三方库的最低支持版本为x),所以抛出了这个异常。
解决办法:文件地址:Flutter项目文件夹/android/app/src/main/java/AndroidManifest.xml
中添加
<uses-sdk tools:overrideLibrary="com.pauldemarco.flutter_blue"/>
问题3
问题出现在Android端,连接蓝牙设备后,匹配特征值的时候
Exception has occurred. PlatformException (PlatformException(set_notification_error, error when writing the descriptor, null))
报:set_notification_error,编写描述符时出错。
原因:
我个人的分析,设备是使用标准的Android API用于蓝牙,必须等待回调,该回调表明之前的GATT操作已完成(onDescriptorWrite),直到可以编写下一个描述符以启用特征通知。也就是程序有个通过特征性UUID比较的工作顺序,由于信号不好,或者是信号缓冲之类的原因,造成蓝牙可能流程一步一步走不下来。
解决:
setNotifyValue(true) 添加延时操作
const timeout = const Duration(seconds: 30);
Timer(timeout, () {
_BleDataCallback();
});
_BleDataCallback() async {
await mCharacteristic.setNotifyValue(true);
/*
...需要编写的蓝牙数据返回处理操作 这里只做单个问题处理示例
后期完整 flutter_blue 操作教程 会有 连接,设置特征值,发送数据,接收数据完整示例
*/
}