Подтвердить что ты не робот

Работает ли 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 еще в июне. Он больше не делает, после последнего обновления.

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

РЕДАКТИРОВАТЬ:. Это было воспроизведено хотя бы одним человеком, который открыл проблему с Google здесь: https://code.google.com/p/android-developer-preview/issues/detail?id=1570

4b9b3361

Ответ 1

К сожалению, официальный ответ от 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

Ответ 2

Это не полное решение, но предлагаемый work-around отправленный mattprec в 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;
  }
}

Ответ 3

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

UPDATE:

Запись на следующую запись: https://code.google.com/p/android-developer-preview/issues/detail?id=1570#c52

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

UPDATE: Я работаю над Nexus 5 Android 5.0 build number LPX13D

в соответствии с этим fooobar.com/questions/263698/...

После выполнения вашего обходного пути 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.");
            }

        }

    };

всегда возвращает callback onStartFailure с кодом ошибки 5 (ADVERTISE_FAILED_FEATURE_UNSUPPORTED)

Ответ 4

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

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