WLAN-Suche – Übersicht

Mit den WLAN-Scanfunktionen der WifiManager API können Sie eine Liste der WLAN-Zugangspunkte abrufen, die auf dem Gerät sichtbar sind.

WLAN-Suche

Der Scanvorgang umfasst drei Schritte:

  1. Registrieren Sie einen Broadcast-Listener für SCAN_RESULTS_AVAILABLE_ACTION. Er wird aufgerufen, wenn Suchanfragen abgeschlossen sind, und gibt den Status „Erfolgreich“ oder „Fehlgeschlagen“ zurück. Auf Geräten mit Android 10 (API-Level 29) und höher wird diese Übertragung für jeden vollständigen WLAN-Scan gesendet, der von der Plattform oder anderen Apps auf dem Gerät ausgeführt wird. Apps können alle Scanabschlüsse auf dem Gerät passiv über die Übertragung abhören, ohne selbst einen Scan auszuführen.

  2. Fordern Sie einen Scan an, indem Sie WifiManager.startScan() drücken. Überprüfen Sie unbedingt den Rückgabestatus der Methode, da der Aufruf fehlschlagen kann. aus einem der folgenden Gründe:

    • Scananfragen können aufgrund zu vieler Scans in kurzer Zeit gedrosselt werden.
    • Das Gerät ist inaktiv und die Suche ist deaktiviert.
    • Die WLAN-Hardware meldet einen Scanfehler.
  3. Rufen Sie Scanergebnisse ab mit WifiManager.getScanResults() Die zurückgegebenen Scanergebnisse sind die zuletzt aktualisierten Ergebnisse, die möglicherweise aus einem vorherigen Scan stammen, wenn der aktuelle Scan nicht abgeschlossen oder erfolgreich war. Das bedeutet, dass Sie möglicherweise ältere Scanergebnisse erhalten, wenn Sie diese Methode aufrufen. bevor eine erfolgreiche SCAN_RESULTS_AVAILABLE_ACTION Nachricht an alle.

Der folgende Code zeigt ein Beispiel für die Implementierung dieser Schritte:

val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager

val wifiScanReceiver = object : BroadcastReceiver() {

  override fun onReceive(context: Context, intent: Intent) {
    val success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false)
    if (success) {
      scanSuccess()
    } else {
      scanFailure()
    }
  }
}

val intentFilter = IntentFilter()
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
context.registerReceiver(wifiScanReceiver, intentFilter)

val success = wifiManager.startScan()
if (!success) {
  // scan failure handling
  scanFailure()
}

....

private fun scanSuccess() {
  val results = wifiManager.scanResults
  ... use new scan results ...
}

private fun scanFailure() {
  // handle failure: new scan did NOT succeed
  // consider using old scan results: these are the OLD results!
  val results = wifiManager.scanResults
  ... potentially use older scan results ...
}
WifiManager wifiManager = (WifiManager)
                   context.getSystemService(Context.WIFI_SERVICE);

BroadcastReceiver wifiScanReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context c, Intent intent) {
    boolean success = intent.getBooleanExtra(
                       WifiManager.EXTRA_RESULTS_UPDATED, false);
    if (success) {
      scanSuccess();
    } else {
      // scan failure handling
      scanFailure();
    }
  }
};

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
context.registerReceiver(wifiScanReceiver, intentFilter);

boolean success = wifiManager.startScan();
if (!success) {
  // scan failure handling
  scanFailure();
}

....

private void scanSuccess() {
  List<ScanResult> results = wifiManager.getScanResults();
  ... use new scan results ...
}

private void scanFailure() {
  // handle failure: new scan did NOT succeed
  // consider using old scan results: these are the OLD results!
  List<ScanResult> results = wifiManager.getScanResults();
  ... potentially use older scan results ...
}

Einschränkungen

Mit Android 8.0 (API-Level 26) wurden die Berechtigungen und die zulässige Häufigkeit von WLAN-Scans.

Um die Netzwerkleistung, Sicherheit und Akkulaufzeit zu verbessern, wurden in Android 9 (API-Level 28) die Berechtigungsanforderungen verschärft und die Häufigkeit von WLAN-Scans weiter eingeschränkt.

Berechtigungen

Android 8.0 und Android 8.1:

Für einen erfolgreichen Aufruf von WifiManager.getScanResults() ist eine der folgenden Berechtigungen erforderlich:

Wenn die anrufende App keine dieser Berechtigungen hat, schlägt der Anruf mit SecurityException fehl.

Auf Geräten mit Android 8.0 (API-Level 26) und höher können Sie verwenden Sie die CompanionDeviceManager um im Namen Ihrer App einen Scan nach Begleitgeräten in der Nähe durchzuführen, ohne die die Berechtigung zur Standortermittlung benötigen. Weitere Informationen zu dieser Option finden Sie unter Begleitgerät Gerätekopplung ein.

Android 9:

Damit ein Aufruf von WifiManager.startScan() erfolgreich ist, müssen alle der folgenden Bedingungen erfüllt sein:

Android 10 (API-Level 29) und höher:

Damit ein Aufruf von WifiManager.startScan() erfolgreich ist, müssen alle der folgenden Bedingungen erfüllt sein:

  • Wenn Ihre App auf das Android 10 (API-Level 29) SDK oder höher ausgerichtet ist, hat die ACCESS_FINE_LOCATION Berechtigung.
  • Wenn Ihre App auf ein SDK ausgerichtet ist, das niedriger als Android 10 (API-Level 29) ist, hat sie die Berechtigung ACCESS_COARSE_LOCATION oder ACCESS_FINE_LOCATION.
  • Deine App hat die CHANGE_WIFI_STATE Berechtigung.
  • Die Standortdienste sind auf dem Gerät aktiviert (unter Einstellungen > Standort).

Damit WifiManager.getScanResults() erfolgreich aufgerufen werden kann, müssen alle der folgenden Bedingungen erfüllt sein:

  • Wenn Ihre App auf das Android 10 (API-Level 29) SDK oder höher ausgerichtet ist, hat die Berechtigung ACCESS_FINE_LOCATION.
  • Wenn Ihre App auf ein SDK ausgerichtet ist, das niedriger als Android 10 (API-Level 29) ist, hat sie die Berechtigung ACCESS_COARSE_LOCATION oder ACCESS_FINE_LOCATION.
  • Ihre App hat die Berechtigung ACCESS_WIFI_STATE.
  • Die Standortdienste sind auf dem Gerät aktiviert (unter Einstellungen > Standort).

Wenn die anrufende App nicht alle diese Anforderungen erfüllt, schlägt der Anruf mit einem SecurityException fehl.

Drosselung

Die folgenden Einschränkungen gelten für die Häufigkeit von Scans mit WifiManager.startScan()

Android 8.0 und Android 8.1:

Jede Hintergrund-App kann innerhalb von 30 Minuten einmal einen Scan durchführen.

Android 9:

Jede App im Vordergrund kann innerhalb von zwei Minuten viermal gescannt werden. Dies ermöglicht eine mehrere Scans in kurzer Zeit.

Alle Hintergrund-Apps zusammen können innerhalb von 30 Minuten einmal einen Scan durchführen.

Android 10 und höher:

Es gelten dieselben Drosselungslimits wie bei Android 9. Es gibt eine neue Entwickleroption, um die Drosselung für lokale Tests zu deaktivieren (unter Entwickleroptionen > Netzwerk > Drosselung der WLAN-Suche).