不能在BluetoothGattCallback上调用onServicesDiscovered

时间:2015-07-10 03:21:50

标签: android bluetooth-lowenergy ibeacon-android

我开始使用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且新状态已连接。状态是否使其无法获得回调

2 个答案:

答案 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 /主线程上运行