我开始使用ibeacon和android。但是有一些问题需要你的帮助。在blutoothGatCallback上,我实现onConnectionStateChange并调用discoverServices()。 Althougth,discoverServices()返回true但没有任何回调执行,我希望onServicesDiscovered被调用,但不是。
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status,
int newState) {
Log.i(TAG, "onConnectionStateChange : " + status + " newState : "
+ newState);
if (newState == BluetoothProfile.STATE_CONNECTED) {
boolean isdiscover= mBluetoothGatt.discoverServices();
if(isdiscover){
mConnected = true;
}
}
}
状态为133且新状态已连接。状态是否使其无法获得回调
答案 0 :(得分:2)
更多信息会有所帮助,您能否提供收到的广告数据?
以下只是一个猜测,因为Android BLE存在广泛的问题,但是当我意外地向灯塔发出BR / EDR连接时,我已经看到这个一般的133错误。
当GATT服务器设备宣传支持时,Android默认为BR / EDR连接,您可以尝试在connectGatt()中明确设置传输到TRANSPORT_LE,但是因为此参数仅在隐藏版本中可用它,你需要使用反射。
尝试发出如下连接:
private BluetoothGatt mGatt;
private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() { ... }
public void connectToDevice(BluetoothDevice device) {
try {
Method m = device.getClass().getDeclaredMethod("connectGatt", Context.class, boolean.class, BluetoothGattCallback.class, int.class);
int transport = device.getClass().getDeclaredField("TRANSPORT_LE").getInt(null);
mGatt = (BluetoothGatt) m.invoke(device, this, false, gattCallback, transport);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
这样你至少可以确定它与这种Android行为无关。
答案 1 :(得分:1)
状态133可以表示您尝试在非主线程上执行bt命令。
从android-bt-binder线程调用BTLE回调。
所以
mBluetoothGatt.discoverServices();
在binder线程上运行,它应该在GUI /主线程上运行