You need to enable JavaScript to run this app. xamarin-bluetooth-le无法扫描设备及DeviceDiscovered事件绑定疑问
优惠活动
大模型
产品
解决方案
定价
更多

xamarin-bluetooth-le无法扫描设备及DeviceDiscovered事件绑定疑问

问题解答

问题1:DeviceDiscovered事件是否需要绑定两次?

  • 完全不需要,事件仅需绑定1次即可正常接收回调,重复绑定只会导致同一个事件触发时多次执行处理逻辑,比如你代码里每次调用SearchDevices都会新增一个匿名事件处理器,多次调用后会出现同一个设备被重复添加到DeviceList的问题。
  • 官方示例的两次绑定属于示例写法冗余,不是框架要求。

问题2:扫描不到设备的原因及修复方案

第一类:代码逻辑问题

  1. 构造函数中绑定的OnDeviceDiscovered是空实现,虽然你后续在扫描方法里新增了匿名处理器实现了设备添加,但这种重复绑定的写法本身有隐患,建议直接修改构造函数中绑定的OnDeviceDiscovered方法,添加设备到集合的逻辑,删除扫描方法里的重复绑定代码:
private void OnDeviceDiscovered(object sender, DeviceEventArgs args)
{
    // 可增加去重判断,避免重复添加同一个设备
    if(!DeviceList.Any(d=>d.Id == args.Device.Id))
    {
        DeviceList.Add(args.Device);
    }
}
  1. 扫描方法里的循环处理已连接设备时,遇到异常直接return终止了后续扫描逻辑,建议修改异常处理逻辑,不要直接中断扫描流程。

第二类:Android权限&配置问题

  1. 缺少动态权限申请:你只在AndroidManifest.xml里声明了权限,但ACCESS_FINE_LOCATION属于Android 6.0以上要求的危险权限,必须在代码中主动向用户申请授权,用户同意后才能正常扫描BLE设备,你需要在Android项目的主Activity中添加动态申请位置权限的逻辑,权限未授权的情况下扫描不会返回任何设备。
  2. 定位服务未开启:Android 10及以上版本扫描BLE设备需要开启系统定位服务,即使有权限也需要用户打开定位开关才能正常扫描。
  3. 如果你后续升级targetSdk到31及以上,还需要补充新增的蓝牙权限:
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

第三类:调试排查建议

  • 给扫描逻辑加try-catch捕获异常,确认StartScanningForDevicesAsync执行时没有抛出权限不足、蓝牙未开启等异常
  • 可以在事件处理器中加断点或者日志,确认DeviceDiscovered事件是否有触发,排查是事件没触发还是集合没有正确更新

内容的提问来源于stack exchange,提问作者小林 新一郎

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 10:12:03