我试图在我的应用程序中显示所有可用的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);
答案 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()
似乎违反直觉。)