我正在尝试开发一个基于 Eddystone 的应用程序。 我拿了谷歌示例代码并尝试修改它。 Android 规范规定服务数据的最大长度为 31 字节
我尝试在以下代码中更改服务数据长度 构建服务数据()
此处最多仅接受 20 个字节。 超过这个(前 21 字节)我得到 ADVERTISE_FAILED_DATA_TOO_LARGE 错误
//error
Class: AdvertiseCallback
Error : ADVERTISE_FAILED_DATA_TOO_LARGE
Failed to start advertising as the advertise data to be broadcasted is larger than 31 bytes.
我正在使用 UID 框架并在 Lollipop 设备上进行测试。
请告诉我我做错了什么?
byte[] serviceData = null;
// 1+1+10+6+1+1+1 = 21 bytes
private byte[] buildServiceData() throws IOException {
byte txPower = txPowerLevelToByteValue();
byte[] namespaceBytes = toByteArray(namespace.getText().toString());
byte[] instanceBytes = toByteArray(instance.getText().toString());
ByteArrayOutputStream os = new ByteArrayOutputStream();
os.write(new byte[]{FRAME_TYPE_UID, txPower});
os.write(namespaceBytes);
os.write(instanceBytes);
//for testing only
// os.write(new byte[]{txPower});
// os.write(new byte[]{txPower});
// os.write(new byte[]{txPower});
return os.toByteArray();
}
//advertise the data
AdvertiseData advertiseData = new AdvertiseData.Builder()
.addServiceData(SERVICE_UUID, serviceData)
.addServiceUuid(SERVICE_UUID)
.setIncludeTxPowerLevel(false)
.setIncludeDeviceName(false)
.build();
namespace.setError(null);
instance.setError(null);
setEnabledViews(false, namespace, instance, rndNamespace, rndInstance, txPower, txMode);
adv.startAdvertising(advertiseSettings, advertiseData, advertiseCallback);
最佳答案
我怀疑 serviceData
的格式不正确,导致其长度变得太大。很难确切地说出原因,因为并未显示所有代码。
我建议您检查 serviceData 的长度,看看格式错误是否导致其过长。如果导致格式错误的原因并不明显,那么将字节数组打印为十六进制字符串并将其粘贴到您的问题中也可能会有所帮助。
您可以使用如下代码打印出您的 serviceData:
// Put this line near the "advertise the data" comment
Log.d(TAG, "Service data bytes: "+byteArayToHexString(serviceData));
public static String byteArrayToHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
sb.append(String.format("%02x", bytes[i]));
}
return sb.toString();
}
关于java - Android Eddystone广播数据太大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34947400/