flutter_blue icon indicating copy to clipboard operation
flutter_blue copied to clipboard

"Another scan is already in progress" exception (v.0.6.0+1)

Open diso73 opened this issue 5 years ago • 6 comments

Hi, I'm using:

_scanSubscription = _flutterBlue.scan(timeout: SCAN_TIMEOUT, withServices: withServices)
.listen((oneResult) {
        Utils.printDebug('BTDeviceConnection startScan: ScanResult received oneResult: device.id=' + oneResult.device.name);
        if (oneResult.device.id.id == deviceId) {
          // do stuffs with this device 
      _flutterBlue.stopScan();
      _scanSubscription.cancel();
        }
      }, onDone: () {
        Utils.printDebug('BTDeviceConnection startScan: onDone invoked');
      });

It seems to me tha the scan is never stopped before the timeout. If I try to repeat this action before SCAN_TIMEOUT (20 seconds) it always causes:

Unhandled Exception: Exception: Another scan is already in progress. FlutterBlue.scan (package:flutter_blue/src/flutter_blue.dart:80:7)

I tried both stopScan() and/or _scanSubscription.cancel(), but no effect.

Could you please help me?

Thanks

diso73 avatar Jun 21 '19 18:06 diso73

I cannot let the scan to stop programmatically... Simply canceling the scan subscriptions seems not to be enough. Rolling back to 0.5 works fine.

My app shows known devices in a tab card widget and at each card-change I try to connect making a "scan_for_the_device_and_then_connect" process. Users can change cards quite quicly, so I can't wait the scan timeout before restarting the process, I need to force the scan to stop and then restart it.

Thank you

diso73 avatar Jun 22 '19 13:06 diso73

stopScan() seems to work for me in (0.6.0 +1) Have you tried calling the stopScan in the dispose of the card to ensure the scan get's stopped when a user switches card?

VaivanOmmeren avatar Jun 24 '19 14:06 VaivanOmmeren

Neither _flutterBlue.stopScan() nor _scanSubscription.cancel() are preventing this error for me on 0.6.0 +1.

_Exception (Exception: Another scan is already in progress.)

And according to this issue .stopScan() shouldn't be used directly anyway.

frey1esm avatar Jun 29 '19 15:06 frey1esm

Fix below.

Don't throw an exception for now on scan(). Clear scan results and then continue as normal.

Example output of fix:

I/flutter ( 4692): You called scan again while a scan was already in progress.
I/flutter ( 4692):  Clearing scan result list and starting a new scan.
D/BluetoothAdapter( 4692): STATE_ON
I/flutter ( 4692): Found Device
D/BluetoothManager( 4692): getConnectedDevices
D/BluetoothGatt( 4692): connect() - device: 0C:2A:69:16:75:55, auto: false
D/BluetoothGatt( 4692): registerApp()
D/BluetoothGatt( 4692): registerApp() - UUID=ec62285f-22b3-404f-b386-a269117c2a11
D/BluetoothGatt( 4692): onClientRegistered() - status=0 clientIf=8
D/BluetoothManager( 4692): getConnectionState()
D/BluetoothManager( 4692): getConnectedDevices
D/BluetoothGatt( 4692): onClientConnectionState() - status=0 clientIf=8 device=0C:2A:69:16:75:55
D/FlutterBluePlugin( 4692): [onConnectionStateChange] status: 0 newState: 2
I/flutter ( 4692): Connected!
I/flutter ( 4692): Getting services/characteristics.
D/BluetoothGatt( 4692): discoverServices() - device: 0C:2A:69:16:75:55

Code to change... make sure to comment out the throw and then clear your list before you get new scan results to avoid duplicates.

   if (_isScanning.value == true) {      
      print("You called scan again while a scan was already in progress.\n Clearing scan result list and starting a new scan.");
      _scanResults.add(<ScanResult>[]);
      //throw Exception('Another scan is already in progress.');
    }

ghost avatar Jul 18 '19 18:07 ghost

Same issue. +1 for fix proposed by @bretie

raphael-bmec-co avatar Sep 26 '19 10:09 raphael-bmec-co

+1 is it resolved?

Madhukaran avatar Nov 09 '22 20:11 Madhukaran