Intereting Posts
Не может войти в систему с новой версией 3.0 для facebook sdk для Android Ищите исходный код новых виджетов времени и даты Google Calendar Как использовать ADB в Android Studio для просмотра SQLite DB Где дополнительные параметры командной строки в Android Studio версии 1.5.1 для эмулятора Отправка php-массива с помощью POST-андроида Получить текущий onClickListener объекта Android View AsyncTask HttpPost выполняет сбой в 3G, но работает на Wi-Fi Push Notification не отображается пользователю для функции APPINVITE в Facebook SDK для Android Создание пользовательского информационного окна на картах Google V2 Масштабирование Canvas для изменения размера SVG на Android Управление идентификационным номером GCM на сервере Настроить игры libgdx для «планшета» Слушатели событий window.open не работают в Android 4.4.2 Android – Как использовать SharedPreferences в классе non-Activity? Отключение полноэкранного редактирования для ввода мягкой клавиатуры в альбомной ориентации?

Android 5.0 и BLE-реклама пользовательского сервиса UUID

проблема

В настоящее время у меня есть только один 5,0 телефон для тестирования этого (Moto E2 3G on 5.0 Lollipop), но я не могу рекламировать Custom UUID на Android 5.0. Когда я говорю пользовательский UUID, я имею в виду тот, который не предопределен спецификацией Bluetooth LE.

На моем Nexus 6 Android 5.1 все работает нормально.

Код

AdvertiseData.Builder dataBuilder = new AdvertiseData.Builder(); AdvertiseSettings.Builder settingsBuilder = new AdvertiseSettings.Builder(); // Advertising this spec assigned UUID works //ParcelUuid temp = new ParcelUuid(UUID.fromString("0000180D-0000-1000-8000-00805f9b34fb")); // Advertising this custom UUID doesn't work!! ParcelUuid temp = new ParcelUuid(UUID.fromString("02FD04F4-CFFF-4573-B478-F7470A7CF2F2")); dataBuilder.addServiceUuid(temp); settingsBuilder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED); settingsBuilder.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH); settingsBuilder.setConnectable(true); AdvertiseData ad = dataBuilder.build(); bluetoothLeAdvertiser.startAdvertising(settingsBuilder.build(), ad, null, advertiseCallback); 

Наблюдаемое поведение

При просмотре рекламного пакета Moto E2 с пользовательским UUID, вот что я вижу – обратите внимание, что нет никакой информации о Service UUID:

ОБРАЗ

Если я рекламирую присвоенный UUID службы на Moto E2 ( 0000180D-0000-1000-8000-00805f9b34fb ), я вижу, что доступно 16-битное представление UUID:

ОБРАЗ

Если я рекламирую пользовательский UUID на Nexus 6, я вижу данные UUID как ожидалось:

ОБРАЗ

Кто-нибудь может подтвердить это поведение на другом устройстве 5.0? Нужно ли минимально поддерживать версию 5.1? Единственная другая связанная с этим ссылка, которую я смог найти в Интернете по этому поводу, – это пустой билет на Android-трекер .

Solutions Collecting From Web of "Android 5.0 и BLE-реклама пользовательского сервиса UUID"

Я могу подтвердить, что это ошибка на Moto G 2014 с 5.0.2 (и, возможно, с другими устройствами и / или версиями).

Мое обходное решение – просто вставить свой пользовательский UUID в данные производителя вместо поля UUID службы. Это будет работать, только если у вас есть доступ к центру, который сканирует его, и может явно проверить данные производителя, чтобы узнать, присутствует ли UUID при принятии решения о подключении.

С моей реализацией я получил контроль над тем, какие центральные проверки решат, подключаться ли я, поэтому я только что принял эту схему для всех устройств Android, работающих в периферийном режиме, вместо обычного метода addServiceUuid. Протестировано на Galaxy S6 (5.0 .2) и Nexus 5X (6.0), и он работает.

 private AdvertiseData buildAdvertiseData() { int manufacturerID = 0x0001; byte[] uuidBytes = new byte[]{ (byte)0x00, (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04, (byte)0x05, (byte)0x06, (byte)0x07, (byte)0x08, (byte)0x09, (byte)0x0A, (byte)0x0B, (byte)0x0C, (byte)0x0D, (byte)0x0E, (byte)0x0F }; return new AdvertiseData.Builder() .addManufacturerData(manufacturerID, uuidBytes) .setIncludeDeviceName(false) .build(); } 

Убедитесь, что вы исключили имя устройства, некоторые устройства будут помещать рекламный пакет поверх 31 байта в противном случае, и он не сможет начать рекламу.

Только несколько устройств поддерживают рекламу BLE, хотя большинство устройств поддерживают сканирование BLE, так как я знаю, что 5.0 устройств не поддерживается.

Чтобы проверить, поддерживается ли ваше устройство с помощью этого кода в вашем коде Android, вы можете использовать его в любом месте.

 BluetoothAdapter.getDefaultAdapter().isMultipleAdvertisementSupported(); 

Это лучший способ найти, поддерживается ли ваше устройство или нет. Если он не поддерживается, вы не можете ничего делать программно, ожидайте купить тот, который поддерживает.