You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 04:08:15