Как предотвратить дублирование результатов сканирования 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);

Повторяющийся результат маяка


person vindy    schedule 14.10.2016    source источник


Ответы (1)


Вам необходимо вести уникальный список обнаруженных устройств. В Java это часто делается с помощью HashMap вместо ArrayList. Ключ HashMap — это поле, по которому вы хотите распознать каждый элемент как отдельный. В вашем случае вы можете использовать URL-адрес Eddystone или, возможно, MAC-адрес устройства Bluetooth в качестве ключа, чтобы вы знали, что это уникальный маяк.

Вот изменения, которые вы должны внести, чтобы сделать то, что описано выше, сохраняя записи уникальными по MAC-адресу bluetooth маяка:

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());
person davidgyoung    schedule 14.10.2016