BluetoothLeAdvertiser是否在Android 5.0上使用Nexus 5?

在将我的Nexus 5闪烁到Android 5.0预览版本hammerhead-lpx13d后,操作系统报告它不再支持蓝牙LE广告。 如果你打电话给:

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

总是返回null。 另外,新的方法:

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

总是返回false

第一种方法是在6月份的Nexus 5的首个Android L预览版本中返回一个有效的对象。 在刷新最新的更新之后,它不再这样做。

有人看到了吗?

编辑:至less有一个人转载了这个问题,他在这里向Google提出了一个问题: https : //code.google.com/p/android-developer-preview/issues/detail?id = 1570

Solutions Collecting From Web of "BluetoothLeAdvertiser是否在Android 5.0上使用Nexus 5?"

不幸的是,Google的官方回答是否定的,Nexus 5不再支持广告。

我们在Android 5.0 Lollipop中引入了BLE外设模式。 Nexus 6和Nexus 9是前两款支持BLE外设模式的Nexus产品。 由于硬件芯片组的依赖性,较旧的Nexus设备(4/5/7)将无法访问棒棒糖上的function。

请参阅danielho …问题1570上的评论#52: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

这不是一个完整的解决scheme,而是一个在Google Code上由mattprec发布的解决scheme。 它允许您通过调用私有构造函数而不是使用公共API来获取BluetoothLeAdvertiser实例。 不幸的是,关于Nexus 5和Nexus 7 2013版本的testing报告表明,即使在获得实例后,也不能使用该对象来制作广告。 另外,要警告的是,即使你能使它工作,它也可能会破坏Android的任何次要代码版本,因为它使用的是非公开的API。

为了logging,这里是从该页面复制的代码段:

 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上工作正常。在应用程序中有一个信标格式选项。@ davidgyoung您可以给BeaconParser的确切string使这个库以iBeacon格式传输吗?

更新:相关的问题到android-beacon-library / BLE Android SDK。 有没有可能 – 没有调用startAdvertising方法 – 检查是否有广告服务在后台运行?

更新:

录制到此: https : //code.google.com/p/android-developer-preview/issues/detail?id=1570#c52

现在只有Nexus 6和Nexus 9支持Android 5.0中的BLE外设模式

更新:我工作在Nexus 5 Android 5.0内部编号LPX13D

根据这个https://stackoverflow.com/a/26611779/1906420

在实施您的解决方法之后,bluetoothAdvertiser不为空。 从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."); } } }; 

总是给callbackonStartFailure错误代码5(ADVERTISE_FAILED_FEATURE_UNSUPPORTED)