如何防止重复的eddystone扫描结果

时间:2016-10-14 05:15:11

标签: android bluetooth-lowenergy beacon eddystone

我正在尝试在我的应用程序中显示所有可用的Eddystone信标。我有两个eddystone用于测试此应用程序。当我打开应用程序时,它是扫描信标并显示重复值,如附加图像..我想显示两个信标同时当我打开应用程序(-57信标和-69信标)。我正在使用下面的代码。以前我发布了这个并没有得到正确的答案。

我在顶部初始化了这些Arraylist

txpowerArray= new ArrayList<String>();
    urlArray=new ArrayList<String>();

    private BluetoothAdapter.LeScanCallback mLeScanCallback =new BluetoothAdapter.LeScanCallback() {
               @Override
               public void onLeScan(final BluetoothDevice device,final int rssi,final byte[] scanRecord)
               {
                     new Thread()
                       {
                           public void run()
                           {
                               RangingActivity.this.runOnUiThread(new Runnable()
                               {
                                   public void run()
                                   {
                                    connect(rssi, scanRecord,device);

                                   }
                               });
                           }
                       }.start();

               }

           };


     public void connect(int rssi, byte[] scanRecord,BluetoothDevice device){

            List<ADStructure> structures =
                    ADPayloadParser.getInstance().parse(scanRecord);
    mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
           for (ADStructure structure : structures)
            {

                if (structure instanceof EddystoneURL)
                {

                    EddystoneURL es = (EddystoneURL)structure;

                    Log.d("Eddy", "Tx Power = " + es.getTxPower());
                    Log.d("Eddy", "URL = " + es.getURL() );

                        clickUrl=es.getURL().toString();
                        txpower=String.valueOf(es.getTxPower());


                    txpowerArray.add(txpower);
                    urlArray.add("" + clickUrl);

                    Log.d("devicelist", " "+url+" "+txpower);

                        mBluetoothAdapter.stopLeScan(mLeScanCallback);

                }else {

                 }

            }
        }
    }, 4000);

Duplicate beacon result

1 个答案:

答案 0 :(得分:0)

您需要保留检测到的设备的唯一列表。在Java中,通常使用HashMap而不是ArrayList来完成。 HashMap的关键字是您希望将每个项目识别为不同的字段。在您的情况下,您可以使用Eddystone URL或蓝牙设备mac地址作为密钥,因此您知道它是一个独特的信标。

以下是您将要执行上述操作所做的更改,通过信标蓝牙MAC地址保持条目唯一:

txpowerMap= new HashMap<String,String>();
urlMap=new HashMap<String,String>();
...

txpowerMap.put(device.getAddress(), txpower);
urlMap.put(device.getAddress(), "" + clickUrl);

您还必须更新视图逻辑,以便它与HashMap容器而不是ArrayList一起使用。您可以将HashMap的值转换为ArrayList,如下所示:

ArrayList<String> txPowerArray = new ArrayList<String>(txpowerMap.values());