当我尝试使用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);
}
}