2016-12-02 4 views
0

Я пытаюсь обнаружить устройства с низкой энергией Bluetooth, но у меня проблема с методом onLeScan. Он вызывается дважды, и в результате все устройства удваиваются.onLeScan вызывается дважды при обнаружении устройств bluetooth le

Метод, который я использую, чтобы начать сканирование:

private void scanLeDevice(final boolean enable) { 
     if (enable) { 
      handler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        bluetoothAdapter.stopLeScan(getLeScanCallback()); 
        scanning = false; 
       } 
      }, SCAN_PERIOD); 

      scanning = true; 
      bluetoothAdapter.startLeScan(getLeScanCallback()); 
     } else { 
      bluetoothAdapter.stopLeScan(getLeScanCallback()); 
      scanning = false; 
     } 
    } 

Метод возвращение LeScanCallback:

private BluetoothAdapter.LeScanCallback getLeScanCallback(){ 
     BluetoothAdapter.LeScanCallback leScanCallback = 
       new BluetoothAdapter.LeScanCallback() { 
        @Override 
        public void onLeScan(final BluetoothDevice bluetoothDevice, int rssi 
          , byte[] scanRecord) { 
         runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           Log.d(TAG, "device found"); 
           Device device = new Device(); 
           device.setName(bluetoothDevice.getName()); 
           device.setAddress(bluetoothDevice.getAddress()); 
           devices.add(device); 
           deviceListAdapter.notifyDataSetChanged(); 
          } 
         }); 
        } 
       }; 

     return leScanCallback; 
    } 
+1

Там, наверное, не хватает кода размещен, чтобы диагностировать проблему. Попробуйте отладить и установите точку останова на getLeScanCallback, чтобы узнать, получилось ли это имя 2x. Кроме того, иногда устройства обнаруживаются дважды при сканировании. Поэтому вам нужно проверить, находятся ли они уже в устройствах перед добавлением –

+0

getLeScanCallback не вызывается дважды, но вы правы, я должен проверить наличие дубликатов. Я думал, что каждое устройство можно обнаружить только один раз. Спасибо за помощь. – user1852879

ответ

5

Да, BLE устройство может появляться несколько раз в течение цикла сканирования, если их рекламный цикл достаточно часто по сравнению с циклом сканирования. Поэтому вы должны идентифицировать каждое устройство BLE (возможно, с именем или адресом) и добавлять их в свой список только один раз. Вы можете сохранить отдельный список недавно увиденных маяков или просто проверить, содержит ли devices найденное устройство и не добавляет дубликатов. (Или используйте Set вместо List.) Просто обновите любые данные (например, RSSI, если вы его покажете), если устройство BLE уже существует в списке. Вы, вероятно, нужно переопределить equals() и hashCode() в Device сделать либо List.contains() или Set работает надлежащим образом