.NET MAUI中Shiny.BluetoothLE无法识别已连接蓝牙设备求助
解决.NET MAUI中Shiny.BluetoothLE扫描已连接设备无结果的问题
1. 权限配置与动态请求
- 检查平台权限配置:
- Android:在
AndroidManifest.xml中添加<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />和<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />(Android 12+必需)。 - iOS:在
Info.plist中添加NSBluetoothAlwaysUsageDescription(填写蓝牙使用场景描述),iOS 13+需确保权限申请逻辑合规。
- Android:在
- 扫描前必须动态请求权限:执行
await Ble.RequestAccess(),只有返回AccessState.Available时再进行设备查询,避免权限不足导致无结果。
2. 修正设备查询逻辑
- 区分“扫描可发现设备”与“获取已连接设备”:Shiny中获取已连接设备需调用
Ble.GetConnectedPeripherals(),而非普通的扫描方法(普通扫描针对未配对/可发现设备)。 - 确保逻辑顺序:先获取权限,再调用
GetConnectedPeripherals(),避免权限未就绪时执行查询。
3. 确认设备实际连接状态
- 验证测试设备的蓝牙设备是已配对且处于活跃连接状态,而非仅配对未连接。部分设备配对后会自动断开,需在系统蓝牙设置中确认“已连接”状态。
- 部分蓝牙设备仅在特定操作(如数据传输)时保持连接,需确保测试设备处于持续连接状态。
4. 检查代码初始化与依赖注入
- MauiProgram.cs中确认已注册Shiny蓝牙服务:
builder.Services.AddShinyBluetoothLE(); - 在App启动时初始化Shiny:在App构造函数中调用
await ShinyHost.StartAsync()。 - BluePage.xaml.cs中通过依赖注入获取
IBle实例,而非手动创建:private readonly IBle _ble; public BluePage(IBle ble) { InitializeComponent(); _ble = ble; } private async void ScanButton_Clicked(object sender, EventArgs e) { var access = await _ble.RequestAccess(); if (access != AccessState.Available) { await DisplayAlert("提示", "蓝牙权限未授予", "确定"); return; } var connectedDevices = _ble.GetConnectedPeripherals(); if (connectedDevices.Any()) { // 处理已连接设备列表 } else { await DisplayAlert("提示", "无已连接设备", "确定"); } }
5. 平台特定问题排查
- Android:Android 12+需单独请求
BLUETOOTH_CONNECT权限,不能仅依赖Manifest静态配置。 - iOS:确保App已获得蓝牙权限,可在系统设置中检查应用权限状态。
- Windows:在
Package.appxmanifest中声明蓝牙功能,确保应用有权限访问蓝牙设备。
内容的提问来源于stack exchange,提问作者Shubhankar Pande
相关产品推荐
相关产品推荐

