2017-04-20 54 views
0

我想更新每個信標的RSSI值。但是,我似乎並沒有得到它的工作。我想用地圖或HashMap中,以更新設備持有人的RSSI:如何更新BLE信標列表中設備的RSSI

private Map<BluetoothDevice, Integer> mDevicesRssi; 

這是我的設備Holder類:

class DeviceHolder{ 
    BluetoothDevice device; 
    int rssi; 
    public DeviceHolder(BluetoothDevice device, int rssi){ 
     this. device = device; 
     this.rssi = rssi; 
    } 
} 

和我的適配器類

private class LeDeviceListAdapter extends BaseAdapter { 
    private ArrayList<BluetoothDevice> mLeDevices; 
    private ArrayList<DeviceHolder> mLeHolders; 
    private LayoutInflater mInflator; 

    public LeDeviceListAdapter() { 
     super(); 
     mLeDevices = new ArrayList<BluetoothDevice>(); 
     mLeHolders = new ArrayList<DeviceHolder>(); 
     mInflator = DeviceScanActivity.this.getLayoutInflater(); 
    } 

    public void addDevice(DeviceHolder deviceHolder) { 
     if(!mLeDevices.contains(deviceHolder.device)) { 
      DeviceHolder actualDeviceHolder = new DeviceHolder 
      mLeDevices.add(deviceHolder.device); 
      mLeHolders.add(deviceHolder); 
     } 
     else { 
      mDevicesRssi.put(deviceHolder.device, deviceHolder.rssi); 
     } 
     mLeDeviceListAdapter.notifyDataSetChanged(); 
    } 

我想我必須創建一個類似LeDeviceListAdapter類的數組,例如:

mDevicesRssi = new Map<BluetoothDevice, Integer>(); 

但是,這給了我的錯誤,地圖是抽象的。 我的問題是:是否有人提示如何更新deviceHolder對象的rssi,以便RSSI在應用程序中顯示的列表中更新?

其他一切似乎都工作正常。當我只添加沒有if條件的設備時,應用程序會爲每個廣告列出一個新設備 - >沒有過濾器。

非常感謝

Sayus

+0

DeviceHolder actualDeviceHolder =新的DeviceHolder是錯誤的,不應該被視爲代碼的一部分!我用代碼進行實驗的剩餘片段... – Sayus

回答

0

我能夠自己找到解決方案。如果有人使用谷歌提供的有些過時BluetoothLeGatt例如,當遇到同樣的問題,我希望這個答案可以幫助他:

import java.util.HashMap; 

public class DeviceHolder{ 
    private BluetoothDevice device; 
    private int rssi; 


    public DeviceHolder(BluetoothDevice device, int rssi){ 
     this. device = device; 
     this.rssi = rssi; 
    } 
    public String getAddress() { 
     return device.getAddress(); 
    } 
    public String getName() { 
     return device.getName(); 
    } 
    public void setRSSI(int rssi){ 
     this.rssi = rssi; 
    } 
    public int getRSSI() { 
     return rssi; 
    } 
} 

private class LeDeviceListAdapter extends BaseAdapter { 
    private ArrayList<BluetoothDevice> mLeDevices; 
    private ArrayList<DeviceHolder> mLeHolders; 
    private LayoutInflater mInflator; 
    private HashMap<String, DeviceHolder> mLeDevicesRssi; 

    public LeDeviceListAdapter() { 
     super(); 
     mLeDevices = new ArrayList<BluetoothDevice>(); 
     mLeHolders = new ArrayList<DeviceHolder>(); 
     mLeDevicesRssi = new HashMap<String, DeviceHolder>(); 
     mInflator = DeviceScanActivity.this.getLayoutInflater(); 
    } 

    public void addDevice(DeviceHolder deviceHolder, int rssi) { 
     String address = deviceHolder.device.getAddress(); 
     if(!mLeDevices.contains(deviceHolder.device)) { 
      DeviceHolder cDeviceHolder = new DeviceHolder(deviceHolder.device, deviceHolder.rssi); 
      cDeviceHolder.setRSSI(rssi); 
      mLeDevicesRssi.put(address, cDeviceHolder); 
      mLeDevices.add(cDeviceHolder.device); 
      mLeHolders.add(cDeviceHolder); 
     } 
     else if(mLeDevices.contains(deviceHolder.device)) { 
      mLeDevicesRssi.get(address).setRSSI(rssi); 
     } 
     mLeDeviceListAdapter.notifyDataSetChanged(); 
    } 
.... 
} 

private BluetoothAdapter.LeScanCallback mLeScanCallback = 
     new BluetoothAdapter.LeScanCallback() { 

      @Override 
      public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) { 
       DeviceHolder deviceHolder = new DeviceHolder(device, rssi); 
       final int new_rssi = rssi; 
       runOnUiThread(new DeviceAddTask(deviceHolder, new_rssi)); 
      } 
     }; 

class DeviceAddTask implements Runnable { 
    DeviceHolder deviceHolder; 

    public DeviceAddTask(DeviceHolder deviceHolder, int rssi) { 
     this.deviceHolder = deviceHolder; 
     this.deviceHolder.rssi = rssi; 
    } 

    public void run() { 
     mLeDeviceListAdapter.addDevice(deviceHolder, deviceHolder.rssi); 
     mLeDeviceListAdapter.notifyDataSetChanged(); 
    } 
} 

它可能不是以連續的方式來顯示RSSI的最有效方式。但它確實有效。