Android 无法在BluetoothGattCallback上调用OnServicesDiscovery

Android 无法在BluetoothGattCallback上调用OnServicesDiscovery,android,bluetooth-lowenergy,ibeacon-android,Android,Bluetooth Lowenergy,Ibeacon Android,我开始使用ibeacon和android。但是有一些问题需要你的帮助。在BloothGatCallback上,我实现onConnectionStateChange并调用discoverServices()。尽管discoverServices()返回true,但没有执行任何回调,我希望调用OnServicesDiscovery,但不会 @Override public void onConnectionStateChange(BluetoothGatt gatt, int status,

我开始使用ibeacon和android。但是有一些问题需要你的帮助。在BloothGatCallback上,我实现onConnectionStateChange并调用discoverServices()。尽管discoverServices()返回true,但没有执行任何回调,我希望调用OnServicesDiscovery,但不会

@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且newstate已连接。状态是否使其无法获取回拨

更多信息会有所帮助,您能否提供收到的广告数据

以下只是一个猜测,因为Android BLE存在广泛的问题,但是我在意外地向信标发出BR/EDR连接时已经看到了这个一般错误

由于Android在GATT服务器设备宣布支持BR/EDR连接时默认为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的这种行为无关。

更多信息会有所帮助,你能提供收到的广告数据吗

以下只是一个猜测,因为Android BLE存在广泛的问题,但是我在意外地向信标发出BR/EDR连接时已经看到了这个一般错误

由于Android在GATT服务器设备宣布支持BR/EDR连接时默认为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的这种行为无关。

更多信息会有所帮助,你能提供收到的广告数据吗

以下只是一个猜测,因为Android BLE存在广泛的问题,但是我在意外地向信标发出BR/EDR连接时已经看到了这个一般错误

由于Android在GATT服务器设备宣布支持BR/EDR连接时默认为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的这种行为无关。

更多信息会有所帮助,你能提供收到的广告数据吗

以下只是一个猜测,因为Android BLE存在广泛的问题,但是我在意外地向信标发出BR/EDR连接时已经看到了这个一般错误

由于Android在GATT服务器设备宣布支持BR/EDR连接时默认为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行为无关。

状态133可能表示您试图在非主线程上执行bt命令

BTLE回调是从androidbtbinder线程调用的

所以

mBluetoothGatt.discoverServices()


在绑定线程上运行,并且应该在GUI/主线程上运行。状态133表示您试图在非主线程上执行bt命令

BTLE回调是从androidbtbinder线程调用的

所以

mBluetoothGatt.discoverServices()


在绑定线程上运行,并且应该在GUI/主线程上运行。状态133表示您试图在非主线程上执行bt命令

BTLE回调是从androidbtbinder线程调用的

所以

mBluetoothGatt.discoverServices()


在绑定线程上运行,并且应该在GUI/主线程上运行。状态133表示您试图在非主线程上执行bt命令

BTLE回调是从androidbtbinder线程调用的

所以

mBluetoothGatt.discoverServices()


在活页夹线程上运行,它应该在GUI/主线程上运行,因为状态指示错误,因此您应该找出获得它的原因,然后它应该工作正常请注意您使用的iBeacon的制造商和型号。并非所有iBeacon实现都支持GATT服务,因此可能是您不应该能够连接。0x85 as状态指示错误,因此您应该找出获得它的原因,然后它应该正常工作。请注意您使用的iBeacon的制造商和型号。并非所有iBeacon实现都支持GATT服务,因此可能是您不应该能够连接。0x85 as状态指示错误,因此您应该找出获得它的原因,然后它应该正常工作。请注意您使用的iBeacon的制造商和型号。并非所有iBeacon实现都支持GATT服务,因此可能是您不应该能够连接。0x85 as状态指示错误,因此您应该找出获得它的原因,然后它应该正常工作。请注意您使用的iBeacon的制造商和型号。并非所有iBeacon实现都支持GATT服务,因此您可能无法连接。