在Flutter中调用蓝牙功能,可以通过以下步骤实现:
1. 添加依赖
在 pubspec.yaml 文件中添加蓝牙插件:
dependencies:
flutter_blue_plus: ^1.10.0
然后运行:
flutter pub get
2. 权限配置
Android
在 android/app/src/main/AndroidManifest.xml 中添加:
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
iOS
在 ios/Runner/Info.plist 中添加:
<dict>
<key>NSBluetoothAlwaysUsageDescription</key>
<string>需要蓝牙权限来连接设备</string>
</dict>
3. 基本使用代码
import 'package:flutter/material.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
class BluetoothScreen extends StatefulWidget {
@override
_BluetoothScreenState createState() => _BluetoothScreenState();
}
class _BluetoothScreenState extends State<BluetoothScreen> {
FlutterBluePlus flutterBlue = FlutterBluePlus.instance;
List<BluetoothDevice> devices = [];
@override
void initState() {
super.initState();
_startScan();
}
void _startScan() {
// 开始扫描设备
flutterBlue.startScan(timeout: Duration(seconds: 4));
// 监听扫描结果
flutterBlue.scanResults.listen((results) {
setState(() {
devices = results.map((r) => r.device).toList();
});
});
}
void _connectToDevice(BluetoothDevice device) async {
// 连接设备
await device.connect();
// 发现服务
List<BluetoothService> services = await device.discoverServices();
// 处理服务特性等
for (var service in services) {
print("Service: ${service.uuid}");
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('蓝牙设备')),
body: ListView.builder(
itemCount: devices.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(devices[index].name ?? '未知设备'),
subtitle: Text(devices[index].id.toString()),
onTap: () => _connectToDevice(devices[index]),
);
},
),
floatingActionButton: FloatingActionButton(
onPressed: _startScan,
child: Icon(Icons.bluetooth),
),
);
}
}
4. 主要功能
- 扫描设备:
flutterBlue.startScan()
- 连接设备:
device.connect()
- 发现服务:
device.discoverServices()
- 读写数据: 通过服务的特性(characteristics)进行数据交互
注意事项
- 在真实设备上测试,模拟器不支持蓝牙
- iOS需要物理设备且需要蓝牙权限
- 处理连接状态变化和错误情况
- 及时断开连接释放资源
这样就完成了Flutter中蓝牙的基本调用。