首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Beacon beacon = IdUser Beacon.Builder () .setId1 (sysid) .setId2 (IdUser) Android信标库中发布和扫描新信标时出错

在Beacon beacon = IdUser Beacon.Builder () .setId1 (sysid) .setId2 (IdUser) Android信标库中发布和扫描新信标时出错
EN

Stack Overflow用户
提问于 2020-06-27 13:22:28
回答 1查看 40关注 0票数 1

朋友们您好,我的信标有一个错误,原来当我从我的手机传输我的信标时,我暴露了一个UserId,这样以后它就可以被另一个设备检测到,我可以为此UserId识别它,在下面的代码中传递它:

代码语言:javascript
复制
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“

这是我的代码:

代码语言:javascript
复制
@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/

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-27 22:38:05

“奇怪的”值0x00000000000c是一个显示Eddystone-UID实例标识符的十六进制表示的Java字符串(该库将其作为getId2()返回,因为这是Eddystone-UID格式中第二重要的标识符)。因为Eddystone-UID实例标识符是6字节长,所以它不适合Java整数。因此,库将其转换为表示为十六进制的默认字符串表示形式。

对于您的用例,您需要的是丢弃标识符的最高有效字节,将其转换为整数,然后再转换回字符串:

代码语言:javascript
复制
String id2AsDecimal = 
  new Integer(Integer.parseInt(firstBeacon.getId2().substring(6), 16)).toString() // "12"

在您的测试用例中,上面的代码将返回"12“

编辑:上面的代码将您的id2限制为六个十六进制数字-- 0到0xFFFFFF (0到16777215十进制),因为这是Java Integer可以完全容纳的十六进制数字的最大数量。

要获取更多的位数,还可以使用Long.parseLong(...)得到12位十六进制数字。除此之外,您还需要更复杂的解析或数据类型,这些数据类型可以容纳大于长整型的数字。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62606233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档