Android - 连接成功后无法在 onScanResult 回调中找到设备

标签 android bluetooth bluetooth-lowenergy

我正在使用手机扫描 BLE 设备。 每当我收到 onScanResult 的回调时,我都会检查外围设备是否是具有特定 minorId 的 iBeacon,如果是,我会进行设备连接。问题是连接成功后 onScanResult 返回我周围的不同设备,但它们都不是我刚刚连接的设备。在 onScanResult 中找到连接的设备对我来说至关重要。这是正常行为吗?什么会导致这个?当我连接到设备时会发生这种情况 - 只有在那时。

最佳答案

根据蓝牙规范,这是默认行为。对于低功耗蓝牙设备,有 6 种预定义状态:-

  • 待机状态
  • 广告状态
  • 扫描状态
  • 发起国
  • 连接状态
  • 同步状态

规范中规定:“链路层状态机一次只允许一个状态处于 Activity 状态”。这在下面的状态机中得到了证明:-

enter image description here

这就是为什么一旦您连接到广告设备,它就会将状态切换为“连接”并保持该状态。如果您有权访问设备的代码,您可以强制它在连接后进行广告,但并非所有设备都支持此功能。

有关更多信息,请查看 Bluetooth Specification v5.1,第 6 卷,B 部分,第 1 节:链路层状态。

关于Android - 连接成功后无法在 onScanResult 回调中找到设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57969346/

相关文章:

android - 如何解决Android中发生的BluetoothGatt : android. os.DeadObjectException错误?

java - 更新 TextView 导致 Android 应用程序崩溃

android - CardView 中不允许元素 LinearLayout

windows - 如何在 Windows 上使用 PowerShell 脚本连接和断开蓝牙设备?

ios:如何使用音频队列从蓝牙耳机录音?

c - 使用 D-Bus API 读取时 Bluez 超时

iOS 低功耗蓝牙连接

java - 奇怪的用户崩溃报告: Null Pointer exception for something that is definitely there

android - 如何安全地(生命周期感知).collectAsState() 一个 StateFlow?

printing - 如何避免打印后重启蓝牙打印机?