不同SDK级别的Android UUID长度不同?

不同SDK级别的Android UUID长度不同?,android,bluetooth-lowenergy,uuid,Android,Bluetooth Lowenergy,Uuid,我想通过BLE广播一些数据 addServiceData函数接受一个parcelouid和数据 我在我的安卓7.0智能手机上测试了它,Uuid缩小到了16位 虽然此实用程序创建了一个128位UUID,但仅限于Android系统 将16位UUID用于播发,并将自动调整 要符合的128位UUID 这很好,因为我需要发送数据的带宽。但是相同的应用程序在安卓8.1设备上发送完整的128位Uuid 我不明白这一点,我希望我的应用程序总是发送16位Uuid。 我找不到选择Uuid长度的选项。16位蓝牙U

我想通过BLE广播一些数据

addServiceData函数接受一个parcelouid和数据

我在我的安卓7.0智能手机上测试了它,Uuid缩小到了16位

虽然此实用程序创建了一个128位UUID,但仅限于Android系统 将16位UUID用于播发,并将自动调整 要符合的128位UUID

这很好,因为我需要发送数据的带宽。但是相同的应用程序在安卓8.1设备上发送完整的128位Uuid

我不明白这一点,我希望我的应用程序总是发送16位Uuid。
我找不到选择Uuid长度的选项。

16位蓝牙Uuid是以下各项的快捷方式:

0000xxxx-0000-1000-8000-00805F9B34FB
…其中,
xxxx
是16位。例如,如果您想为
牛肉
UUID做广告,我相信您需要将
0000BEEF-0000-1000-8000-00805F9B34FB
传递到
AdvertiseData.Builder

再往下看,Android应该将其识别为16位蓝牙UUID,并仅广播这两个字节。相关代码位于AOSP中的和类中:

public static byte[] uuidToBytes(ParcelUuid uuid) {
    if (uuid == null) {
        throw new IllegalArgumentException("uuid cannot be null");
    }

    if (is16BitUuid(uuid)) {
        byte[] uuidBytes = new byte[UUID_BYTES_16_BIT];
        int uuidVal = getServiceIdentifierFromParcelUuid(uuid);
        uuidBytes[0] = (byte) (uuidVal & 0xFF);
        uuidBytes[1] = (byte) ((uuidVal & 0xFF00) >> 8);
        return uuidBytes;
    }

    ...
我猜这种行为可能在7.0和8.1之间发生了变化。看起来就像之前一样,他们可能已经将128位UUID转换为16位UUID,不管发生什么。现在,看起来只有在128位UUID遵循蓝牙标准/符号的情况下,它才能正确地执行此操作