Android BLE。 device.getUUids()始终返回null

时间:2015-08-27 12:58:18

标签: java android bluetooth bluetooth-lowenergy

我正在尝试扫描BLE设备并仅使用我的设备UUID过滤结果。

我使用了here

中的Google示例代码

找到设备并列出它们。

但是当我尝试通过我的UUID进行过滤时,方法device.getUuids()始终返回null,而不是返回带有设备的UUID的有效数组。

 private BluetoothAdapter.LeScanCallback mLeScanCallback =
        new BluetoothAdapter.LeScanCallback() {

    @Override
    public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                List<String> uuids = new ArrayList<String>();
                uuids.add("MY_VALID_UID");
                ParcelUuid[] deviceUuids = device.getUuids();
                // this if is never exeuted device deviceUuids is always null.
                if (deviceUuids != null) {
                    for (ParcelUuid uuid : device.getUuids()) {
                        if (uuids.contains(uuid.toString())) {
                            mLeDeviceListAdapter.addDevice(device);
                            mLeDeviceListAdapter.notifyDataSetChanged();
                        }
                    }
                }
}
        });
    }
};

我还尝试将我的uuids作为过滤器传递给startLEScan方法,如下所示,但没有返回任何结果。

        String s = "MY_UUID";
        String s2 = s.replace("-", "");
        UUID uuid = new UUID(
                new BigInteger(s2.substring(0, 16), 16).longValue(),
                new BigInteger(s2.substring(16), 16).longValue());
        System.out.println(uuid);
        UUID[] uuids = {uuid};
        mBluetoothAdapter.startLeScan(uuids, mLeScanCallback);

OR

UUID.fromString("MY UUID");

A

1 个答案:

答案 0 :(得分:2)

中央应用程序有两种方式来了解信标支持的服务UUID。

一种方法是从信标发出的广告包中提取信息。但是,如果信标不发出此类数据包(例如AD类型为0x03的数据包),则中央应用程序无法通过这种方式获取有关服务UUID的信息。

另一种方法是连接目标信标并明确要求有关信标支持的服务UUID的信息。

JavaDoc of getUuids()方法说明如下:

  

此方法不会启动服务发现过程以从远程设备检索UUID。而是返回服务UUID的本地缓存副本。

因此,(1)如果信标不发出包含服务UUID信息的数据包,(2)如果您没有要求信标返回有关服务UUID的信息(例如,如果您没有执行'服务发现') ,getUuids()返回null。