2016-10-13 23 views
1

我試圖在我的應用程序中顯示所有可用的Eddystone信標。我有兩個eddystone用於測試此應用程序。當我打開應用程序時,它是scann信標並顯示附加圖像的重複值。 。我想在同一時間顯示兩個信標,當我打開應用程序(-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

初始化這些ArrayList中基本上你的代碼,一旦第一信標被發現停止掃描。找到第一個信標觸發器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

在你的方式只掃描一個beacon.then我有添加處理程序掃描一段時間,然後它顯示重複信標。如何防止?我已編輯我的問題 – vindy

+0

是的,如果廣告週期比掃描週期足夠頻繁,則在掃描週期內信標可能會出現多次。因此,您應該識別每個信標(可能使用Eddystone-UID/Eddystone-URL或device.getAddress()'),並將它們添加到列表中一次。您可以保留最近看到的信標列表並避免添加重複項。如果信標已經存在於列表中,只需更新任何數據。我不知道[有關掃描iBeacons的答案](http://stackoverflow.com/questions/32952919/android-how-do-i-set-uuid-beacon-value-to-proper-textview/32986093)是有幫助的。 –

相關問題