BLE广告ADVERTISE_FAILED_ALREADY_STARTED

时间:2020-06-23 07:13:48

标签: android bluetooth-lowenergy android-ble android-ble-library

当我尝试使用BLE广告时,我的Android S Galaxy S6出现问题。几次得到onStartSuccess回调之后,我开始得到错误为onStartFailure的{​​{1}}回调,然后演变为ADVERTISE_FAILED_ALREADY_STARTED。我专门通过ADVERTISE_FAILED_TOO_MANY_ADVERTISERS方法浏览了source code,发现了以下代码段:

startAdvertising

使用反射,我尝试在调用if (mLeAdvertisers.containsKey(callback)) { postStartFailure(callback, AdvertiseCallback.ADVERTISE_FAILED_ALREADY_STARTED); return; } 之前在代码中获取mLeAdvertisers,以查看其大小是否大于0。每次检查其大小始终为0。即使我检查了在我的startAdvertising回调中。 我没有在源代码中找到其他任何地方,可能会给我onStartFailure错误。有没有人看到此错误并知道如何处理?

这是我开始做广告的方式:

ADVERTISE_FAILED_ALREADY_STARTED

这就是我停止投放广告的方式:

public void startAdvertise(String serviceUUID) {

        if(bluetoothAdapter.isEnabled()) {
            Log.e(TAG, "eddie startAdvertise: ");

            Config config = Config.getInstance(mContext);

            ParcelUuid pUuid = new ParcelUuid(UUID.fromString(serviceUUID));

            AdvertiseData.Builder dataBuilder = new AdvertiseData.Builder();
            dataBuilder.addServiceUuid(pUuid);
            dataBuilder.setIncludeDeviceName(false);
            dataBuilder.setIncludeTxPowerLevel(true);

            int currentTime = (int) (System.currentTimeMillis() / 1000);
            byte[] key = CryptoManager.getInstance(mContext).mySelf.generateEphemeralId(currentTime, BLEScannerManager.sGeoHash);

            dataBuilder.addServiceData(pUuid, key);

            AdvertiseSettings.Builder settingsBuilder = new AdvertiseSettings.Builder();
            settingsBuilder.setAdvertiseMode(config.getAdvertiseMode());
            settingsBuilder.setTimeout((int) config.getAdvertiseDuration());
            settingsBuilder.setTxPowerLevel(config.getAdvertiseTXPowerLevel());
            settingsBuilder.setConnectable(false);

            try {
                Log.e(TAG, "startAdvertise: reflection");
                Field f = bluetoothAdapter.getBluetoothLeAdvertiser().getClass().getDeclaredField("mLeAdvertisers");
                f.setAccessible(true);
                HashMap<AdvertiseCallback, AdvertisingSetCallback > table = (HashMap<AdvertiseCallback, AdvertisingSetCallback>) f.get(bluetoothAdapter.getBluetoothLeAdvertiser());

                Log.e(TAG, "startAdvertise: size of mLeAdvertises is: " + table.keySet().size());
            } catch (Exception e) {
                e.printStackTrace();
            }
            bluetoothAdapter.getBluetoothLeAdvertiser().startAdvertising(settingsBuilder.build(), dataBuilder.build(), advertiseCallback);
        }
    }

0 个答案:

没有答案