xamarin-bluetooth-le无法扫描设备及DeviceDiscovered事件绑定疑问
问题解答
问题1:DeviceDiscovered事件是否需要绑定两次?
- 完全不需要,事件仅需绑定1次即可正常接收回调,重复绑定只会导致同一个事件触发时多次执行处理逻辑,比如你代码里每次调用
SearchDevices都会新增一个匿名事件处理器,多次调用后会出现同一个设备被重复添加到DeviceList的问题。 - 官方示例的两次绑定属于示例写法冗余,不是框架要求。
问题2:扫描不到设备的原因及修复方案
第一类:代码逻辑问题
- 构造函数中绑定的
OnDeviceDiscovered是空实现,虽然你后续在扫描方法里新增了匿名处理器实现了设备添加,但这种重复绑定的写法本身有隐患,建议直接修改构造函数中绑定的OnDeviceDiscovered方法,添加设备到集合的逻辑,删除扫描方法里的重复绑定代码:
private void OnDeviceDiscovered(object sender, DeviceEventArgs args) { // 可增加去重判断,避免重复添加同一个设备 if(!DeviceList.Any(d=>d.Id == args.Device.Id)) { DeviceList.Add(args.Device); } }
- 扫描方法里的循环处理已连接设备时,遇到异常直接return终止了后续扫描逻辑,建议修改异常处理逻辑,不要直接中断扫描流程。
第二类:Android权限&配置问题
- 缺少动态权限申请:你只在
AndroidManifest.xml里声明了权限,但ACCESS_FINE_LOCATION属于Android 6.0以上要求的危险权限,必须在代码中主动向用户申请授权,用户同意后才能正常扫描BLE设备,你需要在Android项目的主Activity中添加动态申请位置权限的逻辑,权限未授权的情况下扫描不会返回任何设备。 - 定位服务未开启:Android 10及以上版本扫描BLE设备需要开启系统定位服务,即使有权限也需要用户打开定位开关才能正常扫描。
- 如果你后续升级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,提问作者小林 新一郎
相关产品推荐
相关产品推荐

