在 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 更大的数字。