2017-01-31 5 views
2

В моем приложении у меня есть запуск и остановка кнопки, когда пользователь нажимает кнопку пуска я называю startScan методBluetoothAdapter не остановит сканирование для BLE устройств

bluetoothAdapter.getBluetoothLeScanner().startScan(getLeScanCallback()); 

Когда пользователь нажимает кнопку остановки я называю stopScan однако это не кажется делать что-либо. BluetoothAdapter продолжает сканирование для новых устройств.

bluetoothAdapter.getBluetoothLeScanner().stopScan(getLeScanCallback()); 

Вот мой метод getLeScanCallback:

private ScanCallback getLeScanCallback(){ 
    ScanCallback leScanCallback = new ScanCallback() { 
     @Override 
     public void onScanResult(int callbackType, ScanResult result) { 
      super.onScanResult(callbackType, result); 
      boolean duplicate = false; 
      for(Device d : devices) { 
       if(d.getAddress().equals(result.getDevice().getAddress())) 
        duplicate = true; 
      } 
      if(!duplicate) { 
       Device device = new Device(); 
       device.setName(result.getDevice().getName()); 
       device.setAddress(result.getDevice().getAddress()); 
       device.setStatus(getString(R.string.disconnected)); 
       devices.add(device); 
       deviceListAdapter.notifyDataSetChanged(); 
      } 
     } 

     @Override 
     public void onBatchScanResults(List<ScanResult> results) { 
      super.onBatchScanResults(results); 
     } 

     @Override 
     public void onScanFailed(int errorCode) { 
      super.onScanFailed(errorCode); 
     } 
    }; 

    return leScanCallback; 
} 

Она вызывается даже после того, как stopScan() называется. Что я делаю неправильно или, другими словами, как остановить сканирование для устройств BLE?

ответ

8

Каждый раз, когда вы вызываете getLeScanCallback, вы создаете новый экземпляр ScanCallback и теряете ссылку на предыдущий экземпляр.

Так что вы не можете остановить сканирование, которое вы начали с старого экземпляра ScanCallback.

-1

заменить

bluetoothAdapter.getBluetoothLeScanner().startScan(getLeScanCallback()); 
bluetoothAdapter.getBluetoothLeScanner().stopScan(getLeScanCallback()); 

с

bluetoothAdapter.getBluetoothLeScanner().startLeScan(getLeScanCallback()); 
bluetoothAdapter.getBluetoothLeScanner().stopLeScan(getLeScanCallback()); 
+0

Я не думаю, что есть такие методы, как startLeScan и stopLeScan. – user1852879

+0

Я использовал в своем проекте –

+1

Есть bluetoothAdapter.startLeScan() и bluetoothAdapter.stopLeScan(), но они устарели. – user1852879

1

я не заметил каких-либо проблем с вашим кодом, это, кажется, хорошо. Возможно, есть проблема с вашим методом getLeScanCallback()?

Вместо того чтобы иметь способ вернуть ScanCallback, вы можете объявить его как переменную-член, чтобы у вас было бы leScanCallback = new ScanCallback(), а затем вы могли бы просто ссылаться на эту переменную-член вместо этого при попытке остановить сканирование.

bluetoothAdapter.getBluetoothLeScanner().stopScan(leScanCallback);

В зависимости от того, какой версии Android вы поддерживаете, это может оказаться полезным добавлением startLeScan и stopLeScan методы, которые Раджеш Panchal предложенной для предварительных устройств Lollipop Android.

0

Результаты сканирования не будут останавливаться немедленно, но в конечном итоге будут остановлены. Существует очередь ожидающих результатов, которые вы можете смыть с:

scanner.flushPendingScanResults();

Но даже тогда, документация ясно, что он будет посылать то, что он нашел обратный вызов. Это происходит, даже если вы прекратили сканирование. Плохой дизайн API, но это то, что есть.

Самый простой, я думаю, это установить флаг, чтобы игнорировать результаты сканирования после их остановки.