2017-12-18 6 views
0

Wie aktiv nach Scans?So fordern Sie aktiv nach Scans an

Die einzige Möglichkeit, die von der WifiManager API zur Verfügung gestellt wird, wie ich es verstehe, ist die startScan()-Methode, die nur einen Empfänger startet für die Wi-Fi-Service-Scans zu hören. Das Problem ist die Verzögerung zwischen den Scans, es braucht zu viel Zeit! Wenn ich mich nicht zu viel bewege, werden keine Scans empfangen, und wenn ich es tue, dauert es zu lange, bis ich es bemerke.

Gibt es eine Möglichkeit, einen Scan dynamisch anzufordern?

Dies ist der Code, den ich verwenden:

// ... 
    wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
    context.registerReceiver(this, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
    wifi.startScan(); 
} 

// ... 

@Override 
public void onReceive(Context context, Intent intent) 
{ 
    List<ScanResult> results = this.wifi.getScanResults(); 
    // ... 

Edit:

Wenn nicht klar ist, ...

Die onReceive Methode erhält Scans manchmal, aber es dauert zu lange. Ich möchte einen Scan auslösen, nicht nur warten bis er kommt. Es kann in einem Thread gemacht werden, der es wiederholt scannt, wie @Barns vorgeschlagen hat.

+1

Vielleicht verstehe ich nicht ganz, was Sie fordern. Wenn Sie jedoch einen Scan auslösen möchten, können Sie in bestimmten Intervallen einen Hintergrund-Thread in einer Schleife verwenden, um den Scan auszulösen. – Barns

+0

@ Barns, tut mir leid, es war nicht klar. Ich möchte den Scan auslösen, nicht nur warten, bis der Dienst einen benachrichtigt. Was verwende ich zum Auslösen? Kontinuierlich (in Intervallen) Aufruf von 'startScan()' in diesem Thread? –

Antwort

0

Die bevorzugte Lösung, die eine Codierung mit einem HandlerpostDelayed anstelle von Thread.sleep nehmen würde. Es ist wichtig, alle Rückrufe zu entfernen!

versuchen, etwas wie folgt aus:

private boolean continueLoop = true; 
private Handler myHandler = new Handler(); 

private void startAutoDownloadManager() { 
    try{ 
     Log.d(TAG, "AutoDownloadManager - Started"); 
     // here the delay (in this example it is effectively the interval) is 1 second 
     myHandler.postDelayed(mAutoDownloadManager, 1000); 
    } 
    catch(Exception ex){ 
     Log.e(TAG, ex.getMessage()); 
    } 
} 

private Runnable mAutoDownloadManager = new Runnable() { 
    public void run() { 
     if(continueLoop){ 
      // preform the scan 
      this.wifi.startScan(); 

      //re-trigger the call to start the scan 
      startAutoDownloadManager(); 
     { 
    } 
}; 

// Make certain that you remove the callback when you leave the activity -- maybe in onPause() 
private void stopAutoDownloadManager(){ 
    try{ 
     myHandler.removeCallbacks(mAutoDownloadManager); 
    } 
    catch(Exception ex){ 
     Log.e(TAG, ex.getMessage()); 
    } 
} 
0

Wie von @Barn vorgeschlagen, kann die startScan() zum Triggern des Scans verwendet werden.

Mein Fehler war, dass diese Methode nur das Ergebnis des Scannens startet und alles dem Wifi-Dienst überlässt. Aber nein, es löst den Scan aus.

Also ... Es ist eine dumme Frage, aber ich werde es hier lassen, vielleicht hilft es jemand anderem.

der Code:

// ... 
    new Thread(this).start(); 
} 

@Override 
public void run() 
{ 
    while (true) try 
    { 
     this.wifi.startScan(); 
     Thread.sleep(2000); 
    } 
    catch (InterruptedException e) { 
     Log.e("Location", e.getMessage()); 
    } 
} 
+0

Ja! Genau das meinte ich. Im Folgenden habe ich einige kleine Änderungen an Ihrem Code vorgenommen (obwohl Ihr Code gut funktioniert). Mein Vorschlag verwendet einfach einen 'Handler' mit' postDelayed' anstelle von 'Thread.sleep'. – Barns

Verwandte Themen