2016-10-13 3 views
1

Я пытаюсь показать все доступные маяки Eddystone в моем приложении. У меня есть два eddystone для тестирования этого приложения. Когда я открываю приложение, это маяки scann и отображают дублированные значения, например, прикрепленное изображение. .i хочу показать оба маяка, когда я открываю приложение (маяк -57 и маяк -69). Я использую код ниже.как получить все доступные маяки Eddystone

я должен инициализировать эти Список_массивов сверху

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 beacons

ответ

0

В основном код останавливает сканирование, как только будет найден первый маяк. Поиск первых маяковых триггеров onLeScan(), который вызывает connect(), который вызывает stopLeScan().

Есть еще какой-то код до stopLeScan(), так что есть шанс (в небольшом временном окне), что иногда встречается другой маяк, и onLeScan() снова вызывается, но это всего лишь тонкий шанс.

Вы должны продолжать сканирование некоторое время и только остановить сканирование на основе таймера. Тогда у обоих (всех) маяков есть шанс найти их во время сканирования.

Так найти другое место для этого:

mBluetoothAdapter.stopLeScan(mLeScanCallback); 

Код может быть что-то вроде: (. Кроме того, начиная новую нить только для вызова runOnUiThread() кажется нелогичным)

// Stops scanning after SCAN_DURATION milliseconds. 
mHandler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     mBluetoothAdapter.stopLeScan(mScanCallback); 
    } 
}, SCAN_DURATION); 

// Starts the scanning 
mBluetoothAdapter.startLeScan(mScanCallback); 

+0

На вашем пути сканируйте только один маяк. Затем я добавлю обработчик для сканирования в течение некоторого времени. Затем он отображает дубликаты beacons.how, чтобы предотвратить это? Я отредактировал свой вопрос – vindy

+0

Да, маяки могут появляться несколько раз во время цикла сканирования, если их рекламный цикл является достаточно частым по сравнению с циклом сканирования. Поэтому вы должны идентифицировать каждый маяк (возможно, с URL-адресом Eddystone-UID/Eddystone или с 'device.getAddress()') и добавлять их в свой список только один раз. Вы можете сохранить список недавно увиденных маяков и не добавлять дубликаты. Просто обновите любые данные, если маяк уже существует в списке. Я не знаю, если [ответ на сканирование iBeacons] (http://stackoverflow.com/questions/32952919/android-how-do-i-set-uuid-beacon-value-to-proper-textview/32986093) полезно. –

Смежные вопросы