Android BLE AdvertiseData Builder - добавление нескольких сервисов при выполнении обратного вызова - PullRequest
0 голосов
/ 15 июня 2019

Я пытаюсь создать несколько служб 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...