我正在尝试在我的应用程序中显示所有可用的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)
您需要保留检测到的设备的唯一列表。在Java中,通常使用HashMap
而不是ArrayList
来完成。 HashMap
的关键字是您希望将每个项目识别为不同的字段。在您的情况下,您可以使用Eddystone URL或蓝牙设备mac地址作为密钥,因此您知道它是一个独特的信标。
以下是您将要执行上述操作所做的更改,通过信标蓝牙MAC地址保持条目唯一:
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());