问题
I start working with ibeacon and android. But there are some problem need for your helps. On blutoothGatCallback I implement onConnectionStateChange and call discoverServices(). Althougth, discoverServices() return true but there is not any callback execute, I hope onServicesDiscovered being called, but not.
@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;
}
}
}
Status is 133 and newstate is connected. Does status make it fail to get callback
回答1:
More information would be helpful, can you supply the received Advertisement data?
The following is just a guess as theres a broad range of issues around with Android BLE, however i seen this general 133 error already when accidentally issuing a BR/EDR connection to a Beacon.
As Android defaults to a BR/EDR connection when the GATT-server device advertises support for it, you can try to explicitely set the transport to TRANSPORT_LE in connectGatt(), however since this parameter is only aviable in the hidden version of it, you need to use reflection.
Try to issue the connection like this:
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();
}
}
That way you can at least be sure its not related to this Android behaviour.
回答2:
Status 133 can indicate that you try to execute bt commands on a non-main thread.
The BTLE callbacks are called from android-bt-binder threads.
So
mBluetoothGatt.discoverServices();
runs on the binder thread and it should run on the GUI/main thread
来源:https://stackoverflow.com/questions/31331914/onservicesdiscovered-not-be-called-on-bluetoothgattcallback