Работает ли BluetoothLeAdvertiser на Nexus 5 с Android 5.0?

После того, как мы выпустили Nexus 5 в версию предварительного просмотра Android 5.0 hammerhead-lpx13d, OS сообщает, что она больше не поддерживает рекламу Bluetooth LE. Если вы звоните:

((BluetoothManager) this.getSystemService(Context.BLUETOOTH_SERVICE)) .getAdapter().getBluetoothLeAdvertiser() 

Всегда возвращает null. Кроме того, новый метод:

 ((BluetoothManager) this.getSystemService(Context.BLUETOOTH_SERVICE)) .getAdapter().isMultipleAdvertisementSupported() 

Всегда возвращает false

Первый метод, используемый для возврата действительного объекта в первый предварительный просмотр Android L для Nexus 5 еще в июне. Этого больше нет, после последнего обновления.

Кто-нибудь видит иначе?

EDIT: это было воспроизведено хотя бы одним человеком, который открыл здесь проблему с Google: https://code.google.com/p/android-developer-preview/issues/detail?id=1570

К сожалению, официальный ответ от Google – нет, Nexus 5 больше не поддерживает рекламу.

Мы внедрили периферийный режим BLE в Android 5.0 Lollipop. Nexus 6 и Nexus 9 – это первые два устройства Nexus, которые поддерживают периферийный режим BLE. Из-за зависимости аппаратного набора микросхем более старые устройства Nexus (4/5/7) не будут иметь доступа к функции на Lollipop.

См. Комментарий № 52 по вопросу 1570 от danielho … @ google.com: режим рекламы BLE не работает https://code.google.com/p/android-developer-preview/issues/detail?id=1570

Тем не менее, я подтвердил, что реклама поддерживается планшетами Nexus 9. См. Здесь подробности: http://developer.radiusnetworks.com/2014/11/18/beacon-transmission-with-android-5.html

Это не полное решение, а предлагаемая работа, размещенная матовой ссылкой в ​​Google Code . Это позволяет вам получить экземпляр BluetoothLeAdvertiser , вызывая частный конструктор, а не публичный API. К сожалению, сообщения об испытаниях на Nexus 5 и версии Nexus 7 2013 говорят, что даже после того, как вы получите экземпляр, вы не сможете использовать этот объект, чтобы сделать рекламные объявления. Кроме того, следует предупредить, что даже если вы можете заставить его работать, он может сломаться на любой небольшой выпуск кода Android, потому что он использует непубличный API.

Для записи здесь приведен фрагмент кода, скопированный с этой страницы:

 private static BluetoothLeAdvertiser getAdvertiserHack(BluetoothAdapter adapter) { try { Class<? extends BluetoothAdapter> adapterClass = adapter.getClass(); Field advertiserField = adapterClass.getDeclaredField("sBluetoothLeAdvertiser"); advertiserField.setAccessible(true); Object advertiser = advertiserField.get(adapter); if (advertiser == null) { Field bluetoothManagerServiceField = adapterClass.getDeclaredField("mManagerService"); bluetoothManagerServiceField.setAccessible(true); Object bluetoothManagerService = bluetoothManagerServiceField.get(adapter); Constructor<?> constructor = BluetoothLeAdvertiser.class.getDeclaredConstructor( bluetoothManagerServiceField.getType()); constructor.setAccessible(true); advertiser = constructor.newInstance(bluetoothManagerService); advertiserField.set(adapter, advertiser); } return (BluetoothLeAdvertiser) advertiser; } catch (Exception e) { return null; } } 

Тем не менее, я подтвердил, что реклама поддерживается планшетами Nexus 9. См. Здесь подробности: http://developer.radiusnetworks.com/2014/11/18/beacon-transmission-with-android-5.html

Приложение QuickBeacon отлично работает на Nexus 9. В приложении есть параметр формата Beacon. @ Davidgyoung Не могли бы вы дать точную строку для BeaconParser, чтобы эта библиотека передавалась в формате iBeacon?

ОБНОВЛЕНИЕ: Связанный вопрос до андроида-маяка-библиотеки / BLE Android SDK. Есть ли возможность – без вызова метода startAdvertising – проверить, работает ли рекламный сервис в фоновом режиме?

ОБНОВИТЬ:

Запись по этому адресу : https://code.google.com/p/android-developer-preview/issues/detail?id=1570#c52

Теперь только Nexus 6 и Nexus 9 поддерживают BLE Peripheal Mode в Android 5.0

ОБНОВЛЕНИЕ: я работаю над номером сборки Nexus 5 для Android 5.0 LPX13D

В соответствии с этим https://stackoverflow.com/a/26611779/1906420

После выполнения вашего обходного пути bluetoothAdvertiser не является нулевым. Вызов startAdvertising от bluetoothAdvertiser

 bluetoothAdvertiser.startAdvertising(settingsBuilder.build(), dataBuilder.build(), advertiseCallback); 

где

 private AdvertiseCallback advertiseCallback = new AdvertiseCallback() { @Override public void onStartSuccess(AdvertiseSettings settingsInEffec) { } @Override public void onStartFailure(int result) { if (result == ADVERTISE_FAILED_DATA_TOO_LARGE) { Log.d(TAG, "Failed to start advertising as the advertise data to be broadcasted is larger than 31 bytes."); } else if(result == ADVERTISE_FAILED_TOO_MANY_ADVERTISERS){ Log.d(TAG, "Failed to start advertising because no advertising instance is available."); } else if(result == ADVERTISE_FAILED_ALREADY_STARTED){ Log.d(TAG, "Failed to start advertising as the advertising is already started."); } else if(result == ADVERTISE_FAILED_INTERNAL_ERROR){ Log.d(TAG, "Operation failed due to an internal error."); } else if(result == ADVERTISE_FAILED_FEATURE_UNSUPPORTED){ Log.d(TAG, "This feature is not supported on this platform."); } else { Log.d(TAG, "There was unknown error."); } } }; 

Всегда дает обратный вызов onStartFailure с кодом ошибки 5 (ADVERTISE_FAILED_FEATURE_UNSUPPORTED)