2017-04-20 3 views
0

各ビーコンのRSSI値を更新します。しかし、私はそれを働かせるようには思わない。私は、デバイスホルダーのRSSIを更新するために、地図やHashMapを使用したい:BLEビーコンリストのデバイスのRSSIを更新する方法

private Map<BluetoothDevice, Integer> mDevicesRssi; 

これは私のデバイスホルダークラスです:

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クラスのようなArrayを作成しなければならないと思う:

しかし、これはMapが抽象であるというエラーを表示します。 私の質問は:RSSIがリストに更新されるように、誰かがdeviceHolderオブジェクトのrssiを更新するヒントを持っていますか?

他のすべてが正常に動作しているようです。 if条件なしでデバイスを追加するだけで、各広告の新しいデバイスが表示されます(フィルタなし)。

どうもありがとう

Sayus

+0

DeviceHolder actualDeviceHolder = new DeviceHolderが間違っていて、コードの一部と見なすべきではありません!コードの実験の残りの断片... – Sayus

答えて

0

私が自分で解決策を見つけることができました。 Googleが提供する、やや時代遅れ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を表示するための最も効率的な方法ではないかもしれません。しかし、それは動作します。

関連する問題