MAUI .NET中使用InTheHand.Bluetooth无法搜索到蓝牙设备
.NET MAUI蓝牙扫描始终返回空集合的解决方案
Android平台修复步骤
1. 补全权限配置
你的AndroidManifest缺少必要的位置权限,Android 12+(API 31及以上)要求位置权限才能发现未配对蓝牙设备。更新AndroidManifest.xml如下:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" /> <!-- 新增位置权限,用于扫描非已配对设备 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
注:如果你的应用不需要通过蓝牙获取位置信息,保留
neverForLocation标记;如果需要,则移除该标记并确保设备位置服务处于开启状态。
2. 添加运行时权限请求
Android 6.0+需要动态请求危险权限,在执行扫描前添加以下代码:
// 检查并请求位置权限 var locationStatus = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>(); if (locationStatus != PermissionStatus.Granted) { locationStatus = await Permissions.RequestAsync<Permissions.LocationWhenInUse>(); if (locationStatus != PermissionStatus.Granted) { await DisplayAlert("权限不足", "需要位置权限才能扫描蓝牙设备", "确定"); return; } } // 检查并请求蓝牙扫描权限 var scanStatus = await Permissions.CheckStatusAsync<Permissions.BluetoothScan>(); if (scanStatus != PermissionStatus.Granted) { scanStatus = await Permissions.RequestAsync<Permissions.BluetoothScan>(); if (scanStatus != PermissionStatus.Granted) { await DisplayAlert("权限不足", "需要蓝牙扫描权限才能扫描设备", "确定"); return; } }
Windows平台修复步骤
1. 更新设备能力配置
修改Package.appxmanifest,添加更详细的蓝牙能力声明:
<DeviceCapability Name="bluetooth"> <Device Id="any"> <Function Type="bluetooth.genericAttributeProfile" /> <Function Type="bluetooth.deviceAssociation" /> </Device> </DeviceCapability> <DeviceCapability Name="location" />
2. 检查系统设置
- 确保Windows设备蓝牙已开启,且目标蓝牙设备处于可发现状态。
- 首次运行应用时,务必允许弹出的位置权限请求。
代码逻辑优化
1. 调整扫描超时时间
如果使用CommunityToolkit.Maui的蓝牙API,默认扫描时长可能过短,导致无法捕获所有设备。指定扫描超时:
var scanOptions = new RequestDeviceOptions { AcceptAllDevices = true, Timeout = TimeSpan.FromSeconds(10) // 设置10秒扫描时长 }; var devices = await Bluetooth.ScanForDevicesAsync(scanOptions);
2. 改用事件监听扫描结果
一次性扫描可能遗漏部分设备,建议通过事件监听实时获取发现的设备:
// 注册设备发现事件 Bluetooth.DeviceDiscovered += (s, e) => { var newDevice = e.Device; // 避免重复添加设备 if (!BluetoothDevices.Any(d => d.Id == newDevice.Id)) { BluetoothDevices.Add(newDevice); Debug.WriteLine($"{newDevice.Name} | {newDevice.Id} | {newDevice.Gatt}"); lblBluetoothSupport.Text = $"Devices found: {BluetoothDevices.Count}"; } }; // 启动持续扫描,10秒后自动停止 await Bluetooth.StartScanningAsync(new ScanOptions { Timeout = TimeSpan.FromSeconds(10) });
额外排查项
- 确认周边蓝牙设备已开启可发现模式(部分设备默认隐藏,需手动开启)。
- 已配对设备可能需要通过
await Bluetooth.GetPairedDevicesAsync()单独获取,部分扫描API默认仅返回未配对设备。 - 确保项目使用.NET 7及以上版本,旧版本MAUI蓝牙API存在兼容性问题。
内容的提问来源于stack exchange,提问作者Aveyron2033
相关产品推荐
相关产品推荐

