如何获得所有可用的Eddystone信标

时间:2016-10-13 11:21:06

标签: 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 beacons

1 个答案:

答案 0 :(得分:0)

基本上,您的代码会在找到第一个信标后立即停止扫描。找到第一个信标触发onLeScan(),调用connect(),调用stopLeScan()

stopLeScan()之前还有一些其他代码,所以有时候(在一个小时间窗口内)有时会找到另一个信标并再次调用onLeScan(),但这只是一个很小的机会。 / p>

您应该继续扫描一段时间,然后才停止基于计时器的扫描。然后两个(所有)信标都有可能在扫描期间被发现。

所以找到其他地方:

mBluetoothAdapter.stopLeScan(mLeScanCallback);

代码可以是:

// 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);

(同样开始一个新线程只调用runOnUiThread()似乎违反直觉。)