Nearby Connections API:Android 12 无法通告和发现状态代码未知的设备(8037、8038、8039)

Nearby Connections API: Android 12 fails to advertise and discover devices with unknown status codes (8037, 8038, 8039)

我正在开发一个应用程序,它使用 Nearby Connections API 和基本的 P2P 策略。突然间,奇怪的是,我无法在我的 Pixel 3a 上使用最新的 Android 12 和 Play 服务来宣传和发现设备。 OnFailureListeners 抛出这些异常:

确实在 docs 和源代码中找不到它们。 我还检查了 Google 的“剪刀石头布”官方示例,它抛出相同的错误代码。

当然,我重新安装了应用程序并重新启动并更新了我的 phone。编辑:我也进行了出厂重置,但没有帮助。但是在我使用 Android Flash 工具降级到最新的 Android 11 后,它又开始工作了。此外,使用不同的 phones.

在 Android 11、10 和 9 上一切仍然正常

知道导致此问题的原因吗?它在过去两周内运行良好,今天停止工作。我认为它需要对源代码进行深入研究(Xlythe,如果我可以寻求你的帮助,那就太好了)。

过了一段时间我终于找到了解决办法。看起来 Nearby Connections(所有 Nearbys?)在 Android 12 上有一个非确定性发生的严重错误(API 可以正常工作几周然后突然会再抛出这些错误几周)。

此错误与 Android 12 的功能更改 related to Bluetooth 有关。引用:

Android 12 introduces the BLUETOOTH_SCAN, BLUETOOTH_ADVERTISE, and BLUETOOTH_CONNECT permissions. These permissions make it easier for apps that target Android 12 to interact with Bluetooth devices, especially for apps that don't require access to device location.

换句话说,一些蓝牙权限现在是遗留的,并且有一些新的权限是强制性以使API工作。并且您需要在代码中处理这两种情况(Android 12 之前和之后)。

所以这里有一个从错误代码到清单权限的快速“映射器”:

  • Error code 8037 发现时 - 您尚未授予权限 BLUETOOTH_SCAN
  • Error code 8038 正在投放广告 - 您尚未授予 BLUETOOTH_ADVERTISE
  • 权限
  • Error code 8039(这也是一个新的)而 onEndpointFound - 您还没有授予 BLUETOOTH_CONNECT
  • 的权限

有关如何正确实施新权限的更多信息,请参阅 documentation

而且我仍在等待 Google 在下一个附近 API 更新中修复它,因为这是一些解决方法。向代码添加正确的错误消息可能需要做一些工作,但如果在 Android 12 的更新后仍然需要其他权限,我也会修改。