在 Beacon beacon = new Beacon.Builder () .setId1 (sysid) .setId2 (IdUser) Android Beacon 库中发布和扫描 IdUser 时出错
Error publishing and scanning the IdUser in Beacon beacon = new Beacon.Builder () .setId1 (sysid) .setId2 (IdUser) Android Beacon Library
你好朋友我有一个关于信标的错误,事实证明,当我从我的手机发送我的信标时phone我公开了一个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) {
}
}
我想请你return这个UserID号码,我不明白我做错了什么请帮忙
这是图书馆 link:https://altbeacon.github.io/android-beacon-library/
“奇怪”值 0x00000000000c 是一个 Java 字符串,显示了 Eddystone-UID 实例标识符的十六进制表示(库 return 将其作为 getId2()
因为这是第二个Eddystone-UID 格式中最重要的标识符。)因为 Eddystone-UID 实例标识符长 6 个字节,所以它不适合 Java 整数。因此库将其转换为以十六进制表示的默认字符串表示形式。
对于您的用例,您想要的是丢弃标识符的最高有效字节,将其转换为整数,然后再转换回字符串:
String id2AsDecimal =
new Integer(Integer.parseInt(firstBeacon.getId2().substring(6), 16)).toString() // "12"
在您的测试用例中,上面的代码将 return "12"
编辑:上面的代码将您的 id2 限制为六个十六进制数字——0 到 0xFFFFFF(十进制 0 到 16777215),因为这是 Java 整数可以完全容纳的最大十六进制数字数。
要获取更多数字,您还可以使用 Long.parseLong(...) 获取 12 位十六进制数字。除此之外,您需要更复杂的解析或数据类型来容纳比 Long 更大的数字。
你好朋友我有一个关于信标的错误,事实证明,当我从我的手机发送我的信标时phone我公开了一个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) {
}
}
我想请你return这个UserID号码,我不明白我做错了什么请帮忙 这是图书馆 link:https://altbeacon.github.io/android-beacon-library/
“奇怪”值 0x00000000000c 是一个 Java 字符串,显示了 Eddystone-UID 实例标识符的十六进制表示(库 return 将其作为 getId2()
因为这是第二个Eddystone-UID 格式中最重要的标识符。)因为 Eddystone-UID 实例标识符长 6 个字节,所以它不适合 Java 整数。因此库将其转换为以十六进制表示的默认字符串表示形式。
对于您的用例,您想要的是丢弃标识符的最高有效字节,将其转换为整数,然后再转换回字符串:
String id2AsDecimal =
new Integer(Integer.parseInt(firstBeacon.getId2().substring(6), 16)).toString() // "12"
在您的测试用例中,上面的代码将 return "12"
编辑:上面的代码将您的 id2 限制为六个十六进制数字——0 到 0xFFFFFF(十进制 0 到 16777215),因为这是 Java 整数可以完全容纳的最大十六进制数字数。
要获取更多数字,您还可以使用 Long.parseLong(...) 获取 12 位十六进制数字。除此之外,您需要更复杂的解析或数据类型来容纳比 Long 更大的数字。