我一直在尝试新的Android Nearby Connections v2.0 API.我的大多数设备现在可以在大多数时间互相交谈,但在尝试连接时我也收到了很多error codes.在我的程序中检查status.getStatusCode(),我可以看到以下返回码:
> STATUS_ALREADY_CONNECTED_TO_ENDPOINT(8003)
> STATUS_BLUETOOTH_ERROR(8007)
> STATUS_ENDPOINT_IO_ERROR(8012)
> STATUS_ERROR(13)
我很难理解这些.第一个错误代码似乎是不言自明的,只是在我没有在所谓的连接的任何一侧用“SUCCESS”返回代码命中onConnectionResult回调的情况下我看到它.我当前的代码中充满了跟踪语句,如果已经达到这些回调,我会看到日志记录条目.因此,设备可能在较低级别连接,但如果是这样,则更高级别的代码并不总能听到它.
我猜测STATUS_BLUETOOTH_ERROR表示记录它的一侧有蓝牙错误,而STATUS_ENDPOINT_IO_ERROR表示另一端有错误(可能涉及蓝牙)?是否有可能获得更多细节?
我偶尔看到的STATUS_ERROR(13)状态听起来像是程序员用于那些“WTF,我们永远不会到达这里”的错误代码,但是如果没有访问源代码,我只能猜测.
请注意,我在其他时间使用相同代码精确地相互通信的设备之间会看到这些错误.有时,如果代码重试的次数足够多,它最终会获得稳定的连接.有时它会连接并立即从另一端断开连接.有时我只是得到了无休止的重复错误消息(STATUS_BLUETOOTH_ERROR和/或STATUS_ENDPOINT_IO_ERROR).
我正在使用附加连接与连接策略P2P_CLUSTER.当双方同时做广告和发现时,这些问题似乎最常发生.但是,我写了两个较小的程序,专门从事广告或发现,他们有时也会得到这些错误(但不常见).
在跟踪消息中,我还注意到来自Nearby Connections的大量警告消息如下所示:
09-04 22:54:40.070 3866-3924/? W/NearbyConnections: Cannot deserialize BluetoothDeviceName: expecting min 16 raw bytes,got 6
我猜这是因为Nearby Connections使用自己的短令牌(如ZGbx)而不是设备蓝牙名称?不过,我对此并不确定.无论如何,如果这些是Nearby Connections自己的特殊令牌,那为什么会发出有关它的警告信息呢?
STATUS_ALREADY_CONNECTED_TO_ENDPOINT:如果在与给定端点有任何挂起(onConnectionInitiated)或已建立(onConnectionResult)连接时调用’requestConnection’,则会发生这种情况.将您的日志语句提前移动到onConnectionInitiated,您应该看到我们抛出此错误的原因.
STATUS_BLUETOOTH_ERROR:蓝牙出了问题.手机可能处于不良状态.这(希望)不应该经常发生.但如果你真的想要修复,请停止广告&在重新尝试requestConnection之前发现.附近的连接将在检测到此错误时切换蓝牙,但仅在没有其他任何操作的情况下才会切换.
STATUS_ENDPOINT_IO_ERROR:我们失去了与其他设备的连接.这可能由于各种原因而发生(它们可能走得太远,蓝牙不稳定,设备停止响应等).如果您在连接时发现,请避免这种情况.手机上的发现很难,最多会降低带宽,导致连接断线最坏.
STATUS_ERROR:出现了其他错误代码不合适的问题.这是一个包罗万象的事.这通常在onConnectionResult(Failed)中返回,以通知您onConnectionInitiated之间出现问题并等待双方接受连接.
我们还在即将发布的版本中降低了“无法反序列化BluetoothDeviceName”的日志严重性,因为它并不是真正的警告.就像你说的那样;我们在发现时看到非邻近连接设备的预期行为.
如果您仍然遇到问题,请告诉我们您正在使用的设备,我们一定会将它们添加到我们的测试套件中.