Android BluetoothGatt setCharacteristicNotification仅设置第一个特征

Android BluetoothGatt setCharacteristicNotification仅设置第一个特征,android,bluetooth,gatt,Android,Bluetooth,Gatt,我在通过同一蓝牙设备同时使用两种不同的特性时遇到了问题。它只记录第一个特征,而不记录第二个特征。如果我切换它们,它仍然会注册第一行,但不会注册第二行。第一个和第二个特征都需要注册和接收。如果有帮助,我使用的是运行4.4.2的三星Galaxy S4 下面是调用setCharacteristicNotification()的代码部分 setCharacteristicNotification if (mBluetoothBeaconGatt != null && mBluetooth

我在通过同一蓝牙设备同时使用两种不同的特性时遇到了问题。它只记录第一个特征,而不记录第二个特征。如果我切换它们,它仍然会注册第一行,但不会注册第二行。第一个和第二个特征都需要注册和接收。如果有帮助,我使用的是运行4.4.2的三星Galaxy S4

下面是调用setCharacteristicNotification()的代码部分

setCharacteristicNotification

if (mBluetoothBeaconGatt != null && mBluetoothBeaconGatt.getService(UUID_CUSTOM_SERVICE) != null) {

        characteristicBracelet = mBluetoothBeaconGatt.getService(UUID_CUSTOM_SERVICE)
                .getCharacteristic(UUID_CUSTOM_BRACELET);

        characteristicBeacon = mBluetoothBeaconGatt.getService(UUID_CUSTOM_SERVICE)
                .getCharacteristic(UUID_CUSTOM_BEACON);

        if(characteristicBracelet != null) {
            Log.i(TAG, "Init Bracelet Characteristics");
            this.setCharacteristicNotification(characteristicBracelet,
                    true);
        }
        if(characteristicBeacon != null) {
            Log.i(TAG, "Init Beacon Characteristics");
            this.setCharacteristicNotification(characteristicBeacon, true);
        }
    }
if (UUID_CUSTOM_BEACON.equals(characteristic.getUuid())) {
        if (mBluetoothBeaconGatt != null) {
            Log.i(TAG, "Enabling indication for beacon");
            mBluetoothBeaconGatt.setCharacteristicNotification(characteristic, enabled);
            BluetoothGattDescriptor descriptor = characteristic
                    .getDescriptor(UUID
                            .fromString(CustomGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
            descriptor
                    .setValue((enabled) ? BluetoothGattDescriptor.ENABLE_INDICATION_VALUE
                            : BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE);
            mBluetoothBeaconGatt.writeDescriptor(descriptor);
        }
    } else if (UUID_CUSTOM_BRACELET.equals(characteristic.getUuid())) {
        if (mBluetoothBraceletGatt != null || mBluetoothBeaconGatt != null) {
            BluetoothGatt gatt = (mBluetoothBeaconGatt != null) ? mBluetoothBeaconGatt : mBluetoothBraceletGatt;
            gatt.setCharacteristicNotification(characteristic, enabled);
            BluetoothGattDescriptor descriptor = characteristic
                    .getDescriptor(UUID
                            .fromString(CustomGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
            descriptor
                    .setValue((enabled) ? BluetoothGattDescriptor.ENABLE_INDICATION_VALUE
                            : BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE);
            gatt.writeDescriptor(descriptor);
        }
    }
测试变量以查看它们是否为空,并验证它们是否为非空

如果您需要其他信息或这是一个副本,请让我知道


感谢您抽出时间提供帮助。

您不能同时执行多个蓝牙操作。一旦您获得一个
onDescriptorWrite
,您就可以启用/禁用下一个特征:

private int index;
private boolean enabled;

private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
    @Override
    public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
        index++;
        setNotification();
    }
}

public void notify(boolean enabled){
    index = 0;
    this.enabled = enabled;
    setNotification();
}

private void setNotification(){
    BluetoothGattCharacteristic characteristic;
    switch(index){
        case 0:
            characteristic = mBluetoothGatt.getService(MY_SERVICE_UUID)
                        .getCharacteristic(UUID_CUSTOM_BRACELET);
            break;
        case 1:
            characteristic = mBluetoothGatt.getService(MY_SERVICE_UUID)
                        .getCharacteristic(UUID_CUSTOM_BEACON);
            break;
        default:
            return;
    }
    mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);
    BluetoothGattDescriptor descriptor = characteristic.getDescriptor(CLIENT_CHARACTERISTIC_CONFIG);
    descriptor.setValue((enabled) ? BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE
                        : BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE);
    mBluetoothGatt.writeDescriptor(desc);
}

来自NewCircle的精彩教程:

我不确定您对多个
BluetoothGatt
对象做了什么。