2016-03-01 225 views
0

我正在开发一个应用程序,我必须连接到Android 4.3上的Bluetooth Low Energy设备。 我想这在我的应用程序,以显示RSSI,但它不工作蓝牙低功耗Rssi Android

@Override 
      public void onLeScan(final BluetoothDevice device, final int rssi, byte[] scanRecord) { 
       //final LeDeviceListAdapter deviceLe = new LeDeviceListAdapter(device, rssi, scanRecord); 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 

         mLeDeviceListAdapter.addDevice(device,rssi); 
         mLeDeviceListAdapter.notifyDataSetChanged(); 

        } 
       }); 

我的名单适配器代码是:

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

    public LeDeviceListAdapter() { 
     super(); 
     mLeDevices = new ArrayList<>(); 
     mInflator = MainActivity.this.getLayoutInflater(); 
    } 

    public void addDevice(BluetoothDevice device) { 
     if (!mLeDevices.contains(device)) { 
      mLeDevices.add(device); 

     } 
    } 

    public BluetoothDevice getDevice(int position) { 
     return mLeDevices.get(position); 
    } 

    public void clear() { 
     mLeDevices.clear(); 
     // notifyDataSetChanged(); 
    } 






    @Override 
    public int getCount() { 
     return mLeDevices.size(); 
    } 

    @Override 
    public Object getItem(int i) { 
     return mLeDevices.get(i); 
    } 

    @Override 
    public long getItemId(int i) { 
     return i; 
    } 

    @Override 
    public View getView(int i, View view, ViewGroup viewGroup) { 
     ViewHolder viewHolder; 
     // General ListView optimization code. 
     if (view == null) { 
      view = mInflator.inflate(R.layout.listitem_device,viewGroup, false); 

      viewHolder = new ViewHolder(); 
      viewHolder.deviceAddress = (TextView) view.findViewById(R.id.device_address); 
      viewHolder.deviceName = (TextView) view.findViewById(R.id.device_name); 
      // viewHolder.signal = (TextView) view.findViewById(R.id.device_signal); 
      view.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) view.getTag(); 
     } 

     BluetoothDevice device = mLeDevices.get(i); 
     //final String rssi_s=device.getRssi(); 
     final String deviceName = device.getName(); 
     /* ScanResult rssi=null; 
     final double rssi_s = rssi.getRssi(); 
     String rssiString = String.valueOf(rssi_s);*/ 
     //final String rssiString =getString(valueOf(rssi_s)); 
     if 
      (deviceName != null && deviceName.length() > 0){ 
      viewHolder.deviceName.setText(deviceName); 
      // viewHolder.signal.setText(rssiString); 

     } 
     else 
      viewHolder.deviceName.setText(R.string.unknown_device); 
      viewHolder.deviceAddress.setText(device.getAddress()); 




     return view; 

    } 
} 


// Device scan callback. 
private BluetoothAdapter.LeScanCallback mLeScanCallback = 
     new BluetoothAdapter.LeScanCallback() { 

      @Override 
      public void onLeScan(final BluetoothDevice device, final int rssi, byte[] scanRecord) { 
       //final LeDeviceListAdapter deviceLe = new LeDeviceListAdapter(device, rssi, scanRecord); 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         // String rssi_signal=String.valueOf(rssi); 


         mLeDeviceListAdapter.addDevice(device); 
         mLeDeviceListAdapter.notifyDataSetChanged(); 

        } 
       }); 
      } 
     }; 

static class ViewHolder { 
    TextView deviceName; 
    TextView deviceAddress; 
    //TextView signal; 
} 

你有任何想法如何,我可以显示这个? 我还需要在我的oncreate方法中输入这个吗?

mLeDeviceListAdapter=new LeDeviceListAdapter(); 
+0

什么是不工作?你没有得到任何扫描结果,或设备列表适配器没有显示正确的东西?请发布列表适配器的代码。 – curob

+0

我的应用可以显示信标的名称和Mac地址,但不是rssi,我敢肯定,我的代码中缺少某些东西,这就是为什么我希望以前有人做过这个操作,请指导我 – geniusme

+0

显示您的适配器代码请。 – curob

回答

1

你的问题是:(1)该适配器本身并不具备跟踪RSSI值和(2)您的适配器列表项视图没有办法显示RSSI值,并将其自身确实适配器的方法没有跟踪RSSI值的方法。下面是详细问题:

问题1列表适配器不能跟踪RSSI值。

您要添加的设备和RSSI值到适配器与此呼吁:

mLeDeviceListAdapter.addDevice(device,rssi); 

但适配器只有这样的方法:

public void addDevice(BluetoothDevice device) { 
    if (!mLeDevices.contains(device)) { 
     mLeDevices.add(device); 

    } 
} 

正如你所看到的方法做不匹配。我建议执行以下操作: 首先创建一个新类,它将同时保存BluetoothDevice和RSSI值。事情是这样的:

private class LeScanRecord { 
    public final BluetoothDevice device; 
    public final int rssi; 

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

然后改变你的适配器来接受新类的跟踪实例(注意,这在文本字段RSSI值填充处理问题2):

/** 
* Adapter for the scan record devices 
*/ 
private class LeDeviceListAdapter extends ArrayAdapter<LeScanRecord > 
{ 
    /** 
    * View inflater 
    */ 
    private final LayoutInflater inflater; 

    public LeDeviceListAdapter() 
    { 
     super(MainActivity.this, R.layout.listitem_device); 
     inflater = MainActivity.this.getLayoutInflater(); 
    } 
    @Override 
    public void add(LeScanRecord object) 
    { 
     for (int i = 0; i < getCount(); i++) 
     { 
      if (getItem(i).device.equals(object.device)) 
      { 
       return; // do not add duplicates 
      } 
     } 
     super.add(object); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     ViewHolder viewHolder; 
     // General ListView optimization code. 
     if (view == null) { 
      view = mInflator.inflate(R.layout.listitem_device,viewGroup, false); 

      viewHolder = new ViewHolder(); 
      viewHolder.deviceAddress = (TextView) view.findViewById(R.id.device_address); 
      viewHolder.deviceName = (TextView) view.findViewById(R.id.device_name); 
      viewHolder.rssi= (TextView) view.findViewById(R.id.device_signal); 
      view.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) view.getTag(); 
     } 

     LeScanRecord record = getItem(position); 
     final String deviceName = record.device.getName(); 
     if (deviceName != null && deviceName.length() > 0){ 
      viewHolder.deviceName.setText(deviceName); 

     } 
     else { 
      viewHolder.deviceName.setText(R.string.unknown_device); 
     } 
     viewHolder.deviceAddress.setText(record.device.getAddress()); 
     viewHolder.rssi.setText(Integer.valueOf(record.rssi)); 


     return view; 
    } 
} 

static class ViewHolder { 
    public TextView deviceName; 
    public TextView deviceAddress; 
    public TextView rssi; 
} 

最后要做的是将扫描记录的实例添加到适配器。所以改变:

@Override 
public void onLeScan(final BluetoothDevice device, final int rssi, byte[] scanRecord) { 
    //final LeDeviceListAdapter deviceLe = new LeDeviceListAdapter(device, rssi, scanRecord); 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      mLeDeviceListAdapter.addDevice(device,rssi); 
      mLeDeviceListAdapter.notifyDataSetChanged(); 

     } 
    }); 
} 

要:

@Override 
public void onLeScan(final BluetoothDevice device, final int rssi, byte[] scanRecord) { 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      mLeDeviceListAdapter.add(new LeScanRecord(device, rssi)); 
      mLeDeviceListAdapter.notifyDataSetChanged(); 

     } 
    }); 
} 
+0

设备的阵列列表如何? – geniusme

+0

BaseAdapter类维护自己的数组;不需要添加你自己的。 – curob

+0

我猜你忘了在addDevice方法的参数中添加rssi,但是当我这样做时,它向我展示了在其中使用的“contains”和“add”中的错误,我认为是因为Rssi是整数而不是BluetoothDevice类型这就是为什么它会拒绝它,你是如何成功运行应用程序的?肯定缺少的东西 – geniusme