如何更新BLE信标列表中设备的RSSI

问题描述:

我想更新每个信标的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

我能够自己找到解决方案。如果有人使用谷歌提供的有些过时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的最有效方式。但它确实有效。