Android外设BluetoothGattServerCallback onServiceAdded()没有被调用
Posted
技术标签:
【中文标题】Android外设BluetoothGattServerCallback onServiceAdded()没有被调用【英文标题】:Android Peripheral BluetoothGattServerCallback onServiceAdded() not getting called 【发布时间】:2018-04-19 20:48:35 【问题描述】:所以我有一个简单的外围应用程序,我正在我的三星 S8 手机上运行的 android Studio 中编写它。我可以很好地设置我所有的 BLE 广告和特征,但是当我添加我的服务时。从另一台 Central 设备(即另一部具有发现蓝牙广告的应用程序的手机)连接时,我没有看到预期的结果。
Android Studio 的 LogCat 输出:
根据日志,我只能看到 2 个默认服务,即通用属性 (1800) 和通用访问 (1801),它们是任何 Gatt 服务器的默认服务。我觉得我错过了应该告诉服务是否确实被添加和发现的“onServiceAdded()”回调。
我的代码没有错误,并且 addService() 调用成功。我的问题是为什么我无法从 onServiceAdded() 得到回复?虽然其他覆盖函数(如 onConnectionStateChange() 似乎工作正常。这似乎是非常基本的,我查看了大量示例,但似乎无法让最后一点起作用。任何有解决方案或一些好的参考资料可供参考的人将不胜感激。
【问题讨论】:
我在大多数手机上都有同样的问题。它适用于三星 Galaxy S7,但没有其他手机可供我测试。 【参考方案1】:我遇到了同样的问题(诺基亚 6.1),onServiceAdded 只被调用了一次,虽然我添加了 2 个服务并且我是随机的
onCharacteristicReadRequest() no char for handle nnn
尝试从其他设备连接时。
我在文档https://developer.android.com/reference/android/bluetooth/BluetoothGattServer.html#addService(android.bluetooth.BluetoothGattService)中找到了相关点
BluetoothGattServerCallback.onServiceAdded(int, BluetoothGattService) 回调将指示该服务是否有 已成功添加。在此之前不要添加其他服务 回调。
我找到的可靠解决方案是添加一个服务,等待 onServiceAdded 被调用,然后添加第二个服务,再次等待 onServiceAdded 然后我调用 startAdvertising。
【讨论】:
这完成了工作,谢谢。供参考this 是一个例子。随着每个服务完成添加,下面的onServiceAdded() 会继续进行下一个服务。【参考方案2】:我遇到了同样的问题,似乎在 GATT 服务器重新启动时之前连接了客户端(中心)时没有调用回调。
如果您断开所有客户端并从干净状态重新启动服务器(外围设备),您将看到回调正常工作(在我的情况下,即使添加了 2 个服务)。
我的服务器也是三星 Galaxy S7(Android 8.0)。客户端是 Android 7 设备。
(除了这个回调问题:) 发生了一些缓存或奇怪的事情,如果您以前有连接,则它不适用于多种服务(一个预定义的和一个自定义的)。就我而言,当客户端已经连接并且我在启动时向服务器添加了多个服务时,gattServer.getService(uuid) 将返回 null。添加一项服务没问题。
【讨论】:
以上是关于Android外设BluetoothGattServerCallback onServiceAdded()没有被调用的主要内容,如果未能解决你的问题,请参考以下文章