Flutter 鸿蒙蓝牙设备扫描实现:蓝牙权限与设备发现
·
Flutter 鸿蒙蓝牙设备扫描实现:蓝牙权限与设备发现
欢迎加入开源鸿蒙跨平台社区! https://openharmonycrossplatform.csdn.net
效果展示


蓝牙扫描演示
扫描功能
- 附近设备发现
- 设备信息显示
- 信号强度指示
- 设备类型识别
连接管理
- 设备连接
- 连接状态显示
- 断开连接
- 已连接设备列表
设备信息展示
设备详情
- 设备名称
- MAC地址
- 设备类型
- 信号强度 (RSSI)
实现步骤
1. 蓝牙管理器实现
核心类设计
class BluetoothManager {
static final BluetoothManager _instance = BluetoothManager._internal();
factory BluetoothManager() => _instance;
final FlutterBluePlus _bluetooth = FlutterBluePlus.instance;
Future<bool> isAvailable() async {
return await _bluetooth.isAvailable;
}
Future<bool> isEnabled() async {
return await _bluetooth.isOn;
}
Stream<ScanResult> startScan() {
_bluetooth.startScan(timeout: Duration(seconds: 10));
return _bluetooth.scanResults;
}
}
2. 权限处理
蓝牙权限
Future<bool> requestBluetoothPermission() async {
if (Platform.isAndroid) {
final status = await Permission.bluetoothScan.request();
if (!status.isGranted) return false;
final status2 = await Permission.bluetoothConnect.request();
if (!status2.isGranted) return false;
}
return true;
}
3. 设备扫描
扫描实现
StreamSubscription? _scanSubscription;
void startScanning() {
setState(() {
isScanning = true;
devices.clear();
});
_scanSubscription = FlutterBluePlus.scanResults.listen((results) {
for (var result in results) {
addOrUpdateDevice(result);
}
});
FlutterBluePlus.startScan(timeout: Duration(seconds: 10));
}
4. 设备连接
连接管理
Future<void> connectToDevice(BluetoothDevice device) async {
try {
await device.connect(timeout: Duration(seconds: 10));
setState(() {
connectedDevices.add(device);
});
// 发现服务
List<BluetoothService> services = await device.discoverServices();
} catch (e) {
print('连接失败: $e');
}
}
功能特性
1. 设备发现
扫描控制
void startScan() {
FlutterBluePlus.startScan(
timeout: Duration(seconds: 10),
allowDuplicates: false,
);
}
void stopScan() {
FlutterBluePlus.stopScan();
}
2. 设备信息
设备模型
class BluetoothDevice {
final String name;
final String address;
final String type;
final int rssi;
final bool isConnectable;
bool isConnected;
BluetoothDevice({
required this.name,
required this.address,
required this.type,
required this.rssi,
this.isConnectable = true,
this.isConnected = false,
});
}
3. 信号强度
RSSI显示
Widget buildSignalStrength(int rssi) {
Color color;
IconData icon;
if (rssi > -50) {
color = Colors.green;
icon = Icons.signal_cellular_alt;
} else if (rssi > -70) {
color = Colors.lightGreen;
icon = Icons.signal_cellular_alt_2_bar;
} else if (rssi > -85) {
color = Colors.orange;
icon = Icons.signal_cellular_alt_1_bar;
} else {
color = Colors.red;
icon = Icons.signal_cellular_0_bar;
}
return Row(
children: [
Icon(icon, color: color),
Text('$rssi dBm', style: TextStyle(color: color)),
],
);
}
4. 设备类型
类型识别
IconData getDeviceIcon(String type) {
switch (type) {
case 'Phone':
return Icons.phone_android;
case 'Computer':
return Icons.computer;
case 'Headphone':
return Icons.headphones;
case 'Watch':
return Icons.watch;
case 'Speaker':
return Icons.speaker;
case 'Fitness':
return Icons.fitness_center;
default:
return Icons.devices;
}
}
使用说明
基本使用
-
检查蓝牙状态
- 检查蓝牙是否可用
- 检查蓝牙是否开启
- 请求必要权限
-
扫描设备
- 点击扫描按钮
- 等待扫描完成
- 查看设备列表
-
连接设备
- 选择目标设备
- 点击连接按钮
- 等待连接成功
高级功能
设备过滤
List<BluetoothDevice> filterDevices(
List<BluetoothDevice> devices, {
String? nameFilter,
int? minRssi,
}) {
return devices.where((device) {
if (nameFilter != null && !device.name.contains(nameFilter)) {
return false;
}
if (minRssi != null && device.rssi < minRssi) {
return false;
}
return true;
}).toList();
}
技术要点
1. 蓝牙状态
状态监听
StreamSubscription? _stateSubscription;
void listenToBluetoothState() {
_stateSubscription = FlutterBluePlus.state.listen((state) {
switch (state) {
case BluetoothState.on:
onBluetoothEnabled();
break;
case BluetoothState.off:
onBluetoothDisabled();
break;
default:
break;
}
});
}
2. 连接状态
状态管理
device.state.listen((state) {
if (state == BluetoothDeviceState.connected) {
onDeviceConnected(device);
} else if (state == BluetoothDeviceState.disconnected) {
onDeviceDisconnected(device);
}
});
3. 性能优化
扫描优化
FlutterBluePlus.startScan(
timeout: Duration(seconds: 10),
allowDuplicates: false,
filterDuplicates: true,
);
最佳实践
1. 权限处理
Android权限
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
2. 错误处理
异常捕获
try {
await device.connect();
} on PlatformException catch (e) {
if (e.code == 'connect_failed') {
showError('连接失败,请重试');
}
} catch (e) {
showError('未知错误: $e');
}
3. 资源释放
及时清理
void dispose() {
_scanSubscription?.cancel();
_stateSubscription?.cancel();
for (var device in connectedDevices) {
device.disconnect();
}
super.dispose();
}
应用场景
1. 智能家居
设备配对
void pairSmartDevice(BluetoothDevice device) async {
await device.connect();
final service = await device.discoverServices();
// 配对逻辑
}
2. 健康设备
数据同步
void syncHealthData(BluetoothDevice device) async {
final heartRate = await readHeartRate(device);
final steps = await readSteps(device);
saveToDatabase(heartRate, steps);
}
3. 音频设备
音频连接
void connectAudioDevice(BluetoothDevice device) async {
await device.connect();
// 切换音频输出
AudioManager.setOutput(device);
}
总结
Flutter鸿蒙蓝牙设备扫描功能实现了完整的蓝牙设备管理解决方案,包括:
- ✅ 蓝牙权限处理
- ✅ 设备扫描发现
- ✅ 设备连接管理
- ✅ 信号强度显示
- ✅ 设备类型识别
该功能为Flutter for OpenHarmony应用提供了专业的蓝牙设备扫描能力,适用于智能家居、健康设备等场景。
更多推荐


所有评论(0)