我开发了一个应用程序来连接到设备并交换数据。
这适用于我的智能手机(API Level 23)。但是当使用API leven 26时,onServiceDiscovered
Callback永远不会触发。gatt.discoverServices()
返回true。我检查newState == BluetoothProfile.STATE_CONNECTED
连接是否成功。之后,我在使用
msecondHandler.postDelayed(new Runnable() {
@Override
public void run() {
boolean state = gatt.discoverServices();
Log.d(TAG,"State Service Discovered: "+state);
}
},3000);
我将延迟时间改为600毫秒到3000毫秒,但回叫从未触发。
答案 0 :(得分:1)
我已经观察到这个问题以及A& D UA-651BLE血压计和运行Android 6.0.1的Nexus 5。如果我不添加延迟,则不会发生回调。我不得不玩一点,找到适用于这款手机和BLE外设组合的确切延迟。但是,它似乎只发生在BOND_BONDED的设备上。
我在其他手机和其他设备上做了一些测试。我从未在运行Nougat或更高版本的设备上看到此问题。 A& D BPM在使用Nougat或Oreo的设备上不需要延迟,所以我想这个问题在以后的版本中得到了解决。甚至在我的带有Android 6.0.1的Nexus 5上,它只发生在A& D BPM上,而其他设备我也不需要延迟。所以真正的问题只出现在特定的组合中。我猜堆栈仍然忙于与外围设备交换密钥,并且在完成该过程之前,discoverServices()不起作用。
北欧BLE经理代码实际上做同样的事情,尽管他们的代码并非特定于任何Android版本,请参阅Android-BLE-Library
所以这是我的代码。我没有打算让延迟设备具体化,这样我就有了更大的成功变化,似乎并没有打扰那些不需要延迟的设备。
// Take action depending on the bond state
if(bondstate == BOND_NONE || bondstate == BOND_BONDED) {
// Connected to device, now proceed to discover it's services but delay a bit if needed
int delayWhenBonded = 0;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
// It seems delays when bonded are only needed in versions below Nougat
// This issue was observed on a Nexus 5 running Android 6.0.1 when connection to a A&D UA-651BLE
// Strangely enough, it also is dependent on the peripheral as others don't seem to need a delay
delayWhenBonded = 1000;
}
final int delay = bondstate == BOND_BONDED ? delayWhenBonded : 0;
bleHandler.postDelayed(new Runnable() {
@Override
public void run() {
HBLogger.i(TAG, String.format("Discovering services of '%s' with delay of %d ms", getName(), delay));
boolean result = gatt.discoverServices();
if (!result) {
HBLogger.i(TAG, "DiscoverServices failed to start");
}
}
}, delay);
} else if (bondstate == BluetoothDevice.BOND_BONDING) {
// Apparently the bonding process has already started let it complete
HBLogger.i(TAG, String.format("Wait for bonding to complete"));
}