Intereting Posts
Как защитить фоновое обслуживание / аварийные сигналы, которые нужно убить в недавно запущенных устройствах в настраиваемых ОС, таких как oppo – coloros, vivo-funtouch os, Xiomi-MIUI os? В чем разница между представлением и активностью в развитии Android? Ошибка Android: Ошибка: ресурс не найден, который соответствует указанному имени Android хранит ключ, декомпилирует страх Ошибка EPIPE (Broken Pipe) при использовании FileTransfer-plugin с cordova 2.0 Android – Интеграция ffmpeg и android-ndk-r9c Сколько очередей запросов Volley должно поддерживаться? Android: как использовать более низкую minSdkVersion, чем объявлено в библиотеке (uiautomator-v18) Есть неустранимые ошибки, которые необходимо исправить сначала Удаление данных из ArrayList с помощью цикла For-loop Поддерживают ли DEX и Dalvik совместимость с двоичными файлами Java? Белый значок уведомления для Android с функцией Phonegap Build и PushPlugin Android-клик по уведомлению не открывает подключенную активность CollapsingToolbarLayout и NestedScrollView не работают Выполнение запроса HTTPS с использованием Android Volley

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(); 

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