朋友们您好,我的信标有一个错误,原来当我从我的手机传输我的信标时,我暴露了一个UserId,这样以后它就可以被另一个设备检测到,我可以为此UserId识别它,在下面的代码中传递它:
String IdUser="23";
public void startBroadcast(String sysid,String IdUser) {
Log.d(TAG, "comenzando la función de transmisión");
Log.d("startBroadcast", "comenzando la función de transmisión"+IdUser);
Beacon beacon = new Beacon.Builder()
.setId1(sysid)
.setId2(IdUser)
.setManufacturer(0x0118) // Radius Networks. Change this for other beacon layouts
.setTxPower(-59)
.setDataFields(Arrays.asList(new Long[]{0l})) // Remove this for beacon layouts without d: fields
.build();
// Change the layout below for other beacon types
BeaconParser beaconParser = new BeaconParser()
.setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT);
beaconTransmitter = new BeaconTransmitter(getApplicationContext(), beaconParser);
beaconTransmitter.startAdvertising(beacon, new AdvertiseCallback() {
@Override
public void onStartFailure(int errorCode) {
Log.e(TAG, "Fallo al pubicar erro en el codigo: " + errorCode);
}
@Override
public void onStartSuccess(AdvertiseSettings settingsInEffect) {
Log.i(TAG, "Inicio del anuncio exitoso.");
Log.d(TAG, settingsInEffect.toString());
}
});
}当我扫描并尝试检测设备时,我得到一个奇怪的UserId => firstBeacon.getId2()=>"0x00000000000c“
这是我的代码:
@Override
public void onBeaconServiceConnect() {
RangeNotifier rangeNotifier = new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
double distancia = 0;
if (beacons.size() > 0) {
Log.d(TAG, "DidRangeBeaconsInRegion contando cercanias:" + beacons.size());
Beacon firstBeacon = beacons.iterator().next();
String beaconLog = "Primera cercania" + firstBeacon.toString() + " es " + firstBeacon.getDistance() + " A metros de distancia.";
Log.d(TAG, String.valueOf(firstBeacon.getId1()));
String beaconID = String.valueOf(firstBeacon.getId1());
String beaconID2 = String.valueOf(firstBeacon.getId2());
Log.d(TAG, beaconLog);
if (distancia < 0.01) {
Log.d("Evento", "Distance");
}
} else {
Log.d("AVISO", "NO EXISTE APROXIMACIONES");
}
}
};
try {
beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
beaconManager.addRangeNotifier(rangeNotifier);
beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
beaconManager.addRangeNotifier(rangeNotifier);
} catch (RemoteException e) {
}
}我希望你返回UserID号,我不明白我做错了什么请帮助这是库链接:https://altbeacon.github.io/android-beacon-library/
发布于 2020-06-27 22:38:05
“奇怪的”值0x00000000000c是一个显示Eddystone-UID实例标识符的十六进制表示的Java字符串(该库将其作为getId2()返回,因为这是Eddystone-UID格式中第二重要的标识符)。因为Eddystone-UID实例标识符是6字节长,所以它不适合Java整数。因此,库将其转换为表示为十六进制的默认字符串表示形式。
对于您的用例,您需要的是丢弃标识符的最高有效字节,将其转换为整数,然后再转换回字符串:
String id2AsDecimal =
new Integer(Integer.parseInt(firstBeacon.getId2().substring(6), 16)).toString() // "12"在您的测试用例中,上面的代码将返回"12“
编辑:上面的代码将您的id2限制为六个十六进制数字-- 0到0xFFFFFF (0到16777215十进制),因为这是Java Integer可以完全容纳的十六进制数字的最大数量。
要获取更多的位数,还可以使用Long.parseLong(...)得到12位十六进制数字。除此之外,您还需要更复杂的解析或数据类型,这些数据类型可以容纳大于长整型的数字。
https://stackoverflow.com/questions/62606233
复制相似问题