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

使用Plugin.BLE for Xamarin.Forms无法检测BLE设备的技术求助

解决Xamarin.Forms中Plugin.BLE无法扫描到BLE设备的问题

我太懂你现在的糟心感受了——蓝牙状态能正常监听,但就是扫不到目标设备,而且其他APP都能轻松检测到,这说明硬件和设备本身没问题,问题肯定出在你的应用配置或者代码逻辑上。结合你的描述和代码,我整理了几个关键排查点:

1. 必须申请运行时位置权限

Android 6.0(API 23)及以上版本,BLE扫描强制要求位置权限,而且仅仅在AndroidManifest.xml中声明是不够的,必须在运行时主动向用户申请权限。你的Manifest里已经加了权限,但没有动态申请的话,系统会默默拒绝BLE扫描请求。

你可以用Xamarin.Essentials来简化权限申请:

using Xamarin.Essentials;

// 在扫描前先申请权限
private async Task RequestLocationPermission()
{
    var status = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();
    if (status != PermissionStatus.Granted)
    {
        status = await Permissions.RequestAsync<Permissions.LocationWhenInUse>();
    }

    if (status != PermissionStatus.Granted)
    {
        display.Text = "位置权限未授予,无法扫描BLE设备";
        return;
    }
}

2. 确保蓝牙处于开启状态后再扫描

你的代码里监听了状态变化,但在启动扫描前没有检查当前蓝牙状态。如果蓝牙还没完全开启就开始扫描,肯定会失败。修改你的BLE方法,先判断蓝牙状态:

private async void BLE() 
{ 
    var ble = CrossBluetoothLE.Current;
    var adapter = CrossBluetoothLE.Current.Adapter;

    // 先检查蓝牙状态
    if (ble.State != Plugin.BLE.Abstractions.BluetoothState.On)
    {
        display.Text = "请先打开蓝牙";
        // 等待蓝牙开启后自动触发扫描
        ble.StateChanged += async (s, e) => 
        {
            if (e.NewState == Plugin.BLE.Abstractions.BluetoothState.On)
            {
                await RequestLocationPermission();
                await StartScanning(adapter);
            }
        };
        return;
    }

    // 蓝牙已开启,先申请权限再扫描
    await RequestLocationPermission();
    await StartScanning(adapter);
}

private async Task StartScanning(IAdapter adapter)
{
    adapter.ScanMode = Plugin.BLE.Abstractions.Contracts.ScanMode.LowLatency;
    adapter.ScanTimeout = 10000; // 延长扫描时间,避免设备响应慢错过

    // 清空之前的设备列表,避免重复数据
    deviceList.Clear();

    adapter.DeviceDiscovered += (s, a) => 
    {
        var deviceName = a.Device.Name ?? $"未知设备 ({a.Device.Id})";
        deviceList.Add(deviceName);
        Debug.WriteLine($"发现设备: {deviceName}");
        // 实时更新UI,必须在主线程执行
        Device.BeginInvokeOnMainThread(() => 
        {
            display.Text = $"已发现 {deviceList.Count} 台设备";
        });
    };

    await adapter.StartScanningForDevicesAsync();
}

3. 尝试扫描特定服务UUID

有些BLE设备只会广播自己的服务UUID,如果你扫描所有设备没反应,可以直接指定目标设备的服务UUID,这样能提高扫描效率和准确性:

// 替换成你的设备实际的服务UUID
var targetServiceUuid = new Guid("你的设备服务UUID");
await adapter.StartScanningForDevicesAsync(serviceUuids: new List<Guid> { targetServiceUuid });

4. 检查Plugin.BLE版本兼容性

确保你使用的是最新版的Plugin.BLE NuGet包,旧版本可能和Xamarin.Forms或Android版本存在兼容性问题。可以在NuGet包管理器中更新到最新稳定版。

5. 调整扫描时机

不要在InitializeComponent()之后立即执行扫描逻辑,这时候页面可能还没完全初始化,权限也没来得及处理。建议把扫描逻辑放在页面的Appearing事件中:

protected override async void OnAppearing()
{
    base.OnAppearing();
    await RequestLocationPermission();
    // 这里再启动扫描流程
}

按照上面的步骤调整后,应该就能正常扫描到你的BLE设备了。如果还是不行,可以试试在Android项目的Properties中,把目标Android版本设置为你测试设备的版本(比如Android 8.1),避免版本适配问题。

内容的提问来源于stack exchange,提问作者John Szatmari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:10:33