Sie können die WLAN-Scanfunktionen des WifiManager API verwenden, um eine Liste der WLAN-Zugangspunkte, die auf dem Gerät sichtbar sind.
WLAN-Suche
Der Scanvorgang umfasst drei Schritte:
Broadcast-Listener registrieren für
SCAN_RESULTS_AVAILABLE_ACTION
, Dieser wird aufgerufen, wenn Scananfragen abgeschlossen sind, und geben ihre Erfolg/Fehler haben. Für Geräte mit Android 10 (API-Level 29) und höher Nachricht an alle bei einem vollständigen WLAN-Suchlauf gesendet, der von die Plattform oder andere Apps. Apps können alle Scans passiv erfassen indem sie den Broadcast verwenden, ohne einen Scan gehören.Scan anfordern mit
WifiManager.startScan()
Ü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.
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 erfolgreicheSCAN_RESULTS_AVAILABLE_ACTION
Nachricht an alle.
Der folgende Code zeigt ein Beispiel für die Implementierung dieser Schritte:
Kotlin
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 ... }
Java
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.
Zur Verbesserung der Netzwerkleistung, Sicherheit und Akkulaufzeit wurden mit Android 9 (API Stufe 28) die Genehmigungsanforderungen verschärft und die Häufigkeit der WLAN-Scans.
Berechtigungen
Android 8.0 und Android 8.1:
Ein erfolgreicher Anruf bei
WifiManager.getScanResults()
erfordert eine der folgenden Berechtigungen:
Wenn die aufrufende App keine dieser Berechtigungen besitzt, schlägt der Aufruf mit einer
SecurityException
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:
Ein erfolgreicher Anruf bei
WifiManager.startScan()
setzt voraus, dass alle der folgenden Bedingungen erfüllt sind:
- Ihre App hat die
ACCESS_FINE_LOCATION
oderACCESS_COARSE_LOCATION
Berechtigung. - Ihre App hat die
CHANGE_WIFI_STATE
Berechtigung. - Die Standortdienste sind auf dem Gerät unter Einstellungen > Standort aktiviert.
Android 10 (API-Level 29) und höher:
Ein erfolgreicher Anruf bei
WifiManager.startScan()
setzt voraus, dass alle der folgenden Bedingungen erfüllt sind:
- 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 eine SDK-Version niedriger als Android 10 (API-Level 29) ausgerichtet ist,
hat die
ACCESS_COARSE_LOCATION
oderACCESS_FINE_LOCATION
Berechtigung. - Deine App hat die
CHANGE_WIFI_STATE
Berechtigung. - Die Standortdienste sind auf dem Gerät aktiviert (unter Einstellungen > Standort).
Für einen erfolgreichen Anruf
WifiManager.getScanResults()
,
Alle der folgenden Bedingungen müssen 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 eine SDK-Version niedriger als Android 10 (API-Level 29) ausgerichtet ist,
hat die Berechtigung
ACCESS_COARSE_LOCATION
oderACCESS_FINE_LOCATION
. - Ihre App hat die
ACCESS_WIFI_STATE
Berechtigung. - 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 folgender Fehlermeldung fehl:
SecurityException
.
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 scannen. 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).