Я пытаюсь создать несколько служб BLE для моего периферийного устройства Android (Fossil Watch), но обнаружил, что при создании AdvertiseData нельзя добавлять несколько служб один за другим, вы должны дождаться обратного вызова:
https://android.googlesource.com/platform/packages/services/Car/+/master/TrustAgent/src/com/android/car/trust/SimpleBleServer.java#139
Если это верно для всех периферийных устройств BLE в Android (и не относится к тому, для чего фактически предназначена эта ссылка выше), как я могу использовать AdvertiseData.Builder () с .addServiceUuid (), чтобы добавить мои вторые и третьи службы в BluetoothGattServerCallback> onServiceAdded?
Другими словами, как мне ждать выполнения обратного вызова и продолжать добавлять сервисы? Как мне реорганизовать мой код, чтобы приспособиться к этому?
Я попытался переопределить обратный вызов и проверить, является ли служба, выполняемая в обратном вызове, первой, затем добавить вторую и т. Д. Сейчас я получаю сообщение об ошибке, хотя (ниже), поэтому я не совсем Обязательно обработайте кусок AdvertiseData.Builder () вне метода, в котором он уже был (который включен в приведенный ниже код):
Cannot resolve method 'addServiceUuid(android.os.ParcelUuid)'
Я просмотрел Google и SO и не нашел подобных вопросов.
Обратный звонок:
private BluetoothGattServerCallback mGattServerCallback = new BluetoothGattServerCallback() {
@Override
public void onServiceAdded(int status, BluetoothGattService service){
if (service == commandsService){ // if the service added is the first one, add the second
advData.addServiceUuid(new ParcelUuid(CONFIRMS_SERVICE_UUID));
} else if (service == confirmsService){ // if the service is the second, add the third
advData.addServiceUuid(new ParcelUuid(ALERTS_SERVICE_UUID));
} else {
// All three should be added, success!
}
}
Реклама началась, где она выдает ошибку (ниже), если были включены следующие комментарии .addServiceUuid ():
private void startAdvertising() {
BluetoothAdapter bluetoothAdapter = mBluetoothManager.getAdapter();
mBluetoothLeAdvertiser = bluetoothAdapter.getBluetoothLeAdvertiser();
if (mBluetoothLeAdvertiser == null) {
Log.w(TAG, "Failed to create advertiser");
return;
}
AdvertiseSettings settings = new AdvertiseSettings.Builder()
.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED)
.setConnectable(true)
.setTimeout(1000)
.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM)
.build();
advData = new AdvertiseData.Builder()
.setIncludeDeviceName(false)
.setIncludeTxPowerLevel(false)
.addServiceUuid(new ParcelUuid(COMMANDS_SERVICE_UUID))
// .addServiceUuid(new ParcelUuid(CONFIRMS_SERVICE_UUID))
// .addServiceUuid(new ParcelUuid(ALERTS_SERVICE_UUID))
.build();
mBluetoothLeAdvertiser
.startAdvertising(settings, advData, mAdvertiseCallback);
}
Если две строки не были закомментированы, возникает эта ошибка:
W/GattServer: LE Advertise Failed: 1
W/Binder: Caught a RuntimeException from the binder stub implementation.
java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.get(ArrayList.java:437)
at android.bluetooth.BluetoothGattServer$1.onServiceAdded(BluetoothGattServer.java:129)
at android.bluetooth.IBluetoothGattServerCallback$Stub.onTransact(IBluetoothGattServerCallback.java:85)
at android.os.Binder.execTransact(Binder.java:697)
Я надеюсь узнать, как использовать AdvertiseData.Builder и добавить несколько сервисов, используя обратный вызов для добавления по одному за раз. Я не понимаю, как использовать обратный вызов и конструктор вместе, и как правильно ждать обратного вызова, чтобы добавить следующий сервис.
Ресурс - я использовал этот проект в качестве примера для начала: http://nilhcem.com/android-things/bluetooth-low-energy