1

我正在编写一个扫描 ble 设备的应用程序,然后在列表视图中显示结果,以便用户可以单击设备进行连接。我有两个问题。一个是当我停止扫描并连接到设备时,连接不是很好。(设备上的 LED 一直闪烁表示连接正在断开并重新连接。)我遇到的第二个问题是在某些手机上我在列表视图中获取同一设备的多个结果。在 OnLeScan() 方法中,我将找到的设备放入数组列表中,以便在扫描完成后显示。我该如何解决我的问题。我知道我正在使用旧的 APi 21+

     private BluetoothAdapter.LeScanCallback mLeScanCallback =
     new BluetoothAdapter.LeScanCallback() {
       @Override
        public void onLeScan(final BluetoothDevice device, final int rssi,
                         byte[] scanRecord) {

         runOnUiThread(new Runnable() {
            @Override
            public void run() {

                mdevices.put(dcount, device);
                names.add(mdevices.get(dcount).getName().toString() + "  " + "MAC:" + mdevices.get(dcount).getAddress() + " " + rssi);
                dcount++;


            }
        });
    }
}; 



 /////////////////////////////



   public void  scanDevice(boolean enable)
   {

  if(enable)
  {

    mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            if (Build.VERSION.SDK_INT < 21) {
                btAdapter.stopLeScan(mLeScanCallback);
            }else
            {
               /// if I comment this out the connection is good
                btAdapter.stopLeScan(mLeScanCallback);
            } 

        }


    }, 1100);


    if (Build.VERSION.SDK_INT < 21) {
        btAdapter.startLeScan(mLeScanCallback);
    } else {

        btAdapter.startLeScan(mLeScanCallback);
    }


}
else
{
    btAdapter.stopLeScan(mLeScanCallback);

}

}

4

1 回答 1

1

对于您的第一个问题,很难说出导致断开连接的原因。也许您正在测试您的设置的环境有足够的干扰导致定期断开连接。这可能是一种可能性。

为避免同一设备的多个结果出现在 中ListView,请使用HashSet跟踪已扫描设备的 。在您的onLeScan回调中,检查具有给定硬件地址的设备是否存在。如果没有,请将其添加到您的ArrayList. 像这样的东西:

private HashSet<String> mLeDevicesScanned = new HashSet<String>();

@Override
public synchronized void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {

    if (mLeDevicesScanned.add(device.getAddress())) {
          // Add this device to your ArrayList
    }

}

此外,请确保HashSet在刷新扫描时清除您的。

于 2015-08-10T17:01:34.970 回答