我有一个小应用程序只执行BLE广告。 该应用在 Nexus 5x with Android 8.0
上运行这是启动BLE广告的代码:
@Override
public void onSuccess(Location location) {
// Got last known location. In some rare situations this can be null.
if (location != null) {
Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault());
try {
List<Address> addresses = geoCoder
.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
if (addresses.size() > 0) {
if (addresses.size() > 0) {
userLocality = addresses.get(0).getLocality();
userCountry = addresses.get(0).getCountryName();
locationProvidedTextView.setText("Your address: " + userLocality + ", " + userCountry);
}
}
} catch (IOException e1) {
e1.printStackTrace();
}
广告开始,但有效载荷是错误的。在 Pre -Android 8.0设备上,当使用第二台设备扫描此消息时,我们会收到正确的service-uuid:
private fun startAdvertising() {
val serviceUuid = ParcelUuid.fromString("DAB5D1DC-0000-1000-8000-00805F9B34FB")
val data = AdvertiseData.Builder()
.setIncludeTxPowerLevel(false)
.setIncludeDeviceName(false)
.addServiceUuid(serviceUuid)
.build()
val settings = AdvertiseSettings.Builder()
.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
.setConnectable(true)
.build()
bluetoothLeAdvertiser!!.startAdvertising(settings, data, advertiserCallback)
}
但是,当我使用Android 8.0在我的Nexus 5x上开始播放广告时,我收到了错误的服务 - uuid:
32-bit Service-UUID: 0xDAB5D1DC
对于BLE扫描部分,我使用playstore中的nrf Connect应用程序。
如果我宣传一个常见的128位服务UUID而不是32位服务UUID,那么一切都按预期工作。
对于我的问题,Android 8.0是否有任何更改?
更新2017-08-28:
Nexus 6P上的相同问题。创建了一个问题:https://issuetracker.google.com/issues/65099899
答案 0 :(得分:0)
仅使用ParcelUuid.fromString(“ DAB5D1DC”) 这将使您的数据包更小。 您的问题可能是因为您广告的数据包太大,我认为最大为32个字节。
答案 1 :(得分:0)
创建常量
public static final UUID serviceUuid = UUID.fromString("DAB5D1DC-0000-1000-8000-00805F9B34FB");
和
val data = AdvertiseData.Builder()
.setIncludeTxPowerLevel(false)
.setIncludeDeviceName(true)
.addServiceUuid(new ParcelUuid(Constants.serviceUuid))
.build()