Możesz użyć funkcji skanowania Wi-Fi udostępnianych przez WifiManager API, aby uzyskać listę Punkty dostępu Wi-Fi widoczne na urządzeniu.
Proces skanowania Wi-Fi
Proces skanowania składa się z 3 etapów:
Zarejestruj detektora transmisji dla
SCAN_RESULTS_AVAILABLE_ACTION
, jest wywoływana po zrealizowaniu żądań skanowania. stanu powodzenia/niepowodzenia. W przypadku urządzeń z Androidem 10 (poziom interfejsu API 29) lub nowszym dla każdego pełnego skanowania Wi-Fi wykonanego na urządzeniu przez platformy lub innych aplikacji. Aplikacje mogą w sposób pasywny nasłuchiwać całego skanowania na urządzeniu, używając transmisji bez skanowania własnych.Wyślij prośbę o skanowanie za pomocą
WifiManager.startScan()
. Sprawdź stan zwrotu metody, ponieważ wywołanie może się nie udać z któregoś z tych powodów:- Żądania skanowania mogą być ograniczane z powodu zbyt wielu skanowań w krótkim czasie.
- Urządzenie jest nieaktywne, a skanowanie jest wyłączone.
- Sprzęt Wi-Fi zgłasza błąd skanowania.
Pobierz wyniki skanowania za pomocą
WifiManager.getScanResults()
. Zwracane wyniki skanowania to najnowsze zaktualizowane wyniki, które mogą być mogą pochodzić z poprzedniego skanowania, jeśli bieżące skanowanie nie zostało ukończone lub zakończyło się powodzeniem. Oznacza to, że jeśli wywołasz tę metodę, możesz uzyskać starsze wyniki skanowania przed otrzymaniemSCAN_RESULTS_AVAILABLE_ACTION
transmisję.
Poniżej znajduje się przykład implementacji tych czynności:
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 ... }
Ograniczenia
W Androidzie 8.0 (poziom interfejsu API 26) wprowadziliśmy ograniczenia dotyczące uprawnień dozwolone częstotliwości skanowania Wi-Fi.
Aby poprawić wydajność sieci, bezpieczeństwo i żywotność baterii, Android 9 (interfejs API) poziomu 28) zaostrzone wymagania dotyczące uprawnień oraz dodatkowo ograniczenie częstotliwości Skanowanie Wi-Fi.
Uprawnienia
Android 8.0 i Android 8.1:
Udane wywołanie do:
WifiManager.getScanResults()
wymaga dowolnego z tych uprawnień:
Jeśli aplikacja do połączeń nie ma żadnego z tych uprawnień, połączenie zakończy się niepowodzeniem.
SecurityException
Na urządzeniach z Androidem 8.0 (poziom interfejsu API 26) lub nowszym możesz też
użyj
CompanionDeviceManager
skanowania urządzeń towarzyszących w pobliżu w imieniu aplikacji bez
wymagają dostępu do lokalizacji. Więcej informacji o tej opcji:
Urządzenie towarzyszące
.
Android 9:
Udane wywołanie do:
WifiManager.startScan()
wymaga spełnienia wszystkich tych warunków:
- Aplikacja ma
ACCESS_FINE_LOCATION
lubACCESS_COARSE_LOCATION
. uprawnienia. - Aplikacja ma
CHANGE_WIFI_STATE
uprawnienia. - Usługi lokalizacyjne są włączone na urządzeniu (w sekcji Ustawienia > Lokalizacja).
Android 10 (poziom interfejsu API 29) i nowszy:
Udane wywołanie do:
WifiManager.startScan()
wymaga spełnienia wszystkich tych warunków:
- Jeśli aplikacja jest kierowana na pakiet SDK na Androida 10 (poziom interfejsu API 29) lub nowszego,
ma
ACCESS_FINE_LOCATION
uprawnienia. - Jeśli aplikacja jest kierowana na pakiet SDK niższy niż Android 10 (poziom interfejsu API 29), aplikacja
ma
ACCESS_COARSE_LOCATION
lubACCESS_FINE_LOCATION
uprawnienia. - Twoja aplikacja ma
CHANGE_WIFI_STATE
uprawnienia. - Usługi lokalizacyjne są włączone na urządzeniu (w sekcji Ustawienia > Lokalizacja).
Aby zadzwonić
WifiManager.getScanResults()
upewnij się, że są spełnione wszystkie te warunki:
- Jeśli aplikacja jest kierowana na pakiet SDK na Androida 10 (poziom interfejsu API 29) lub nowszego,
ma uprawnienie
ACCESS_FINE_LOCATION
. - Jeśli aplikacja jest kierowana na pakiet SDK niższy niż Android 10 (poziom interfejsu API 29), aplikacja
ma uprawnienie
ACCESS_COARSE_LOCATION
lubACCESS_FINE_LOCATION
. - Aplikacja ma
ACCESS_WIFI_STATE
uprawnienia. - Usługi lokalizacyjne są włączone na urządzeniu (w sekcji Ustawienia > Lokalizacja).
Jeśli aplikacja do wykonywania połączeń nie spełnia wszystkich tych wymagań, połączenie zakończy się niepowodzeniem,
SecurityException
.
Ograniczanie
Poniższe ograniczenia mają zastosowanie do częstotliwości skanowania z użyciem
WifiManager.startScan()
Android 8.0 i Android 8.1:
Każda aplikacja w tle może przeskanować urządzenie 1 raz na 30 minut.
Android 9:
Każda aplikacja na pierwszym planie może przeprowadzać skanowanie 4 razy w ciągu 2 minut. Dzięki temu serii skanowań w krótkim czasie.
Wszystkie aplikacje działające w tle łącznie mogą skanować je raz w ciągu 30 minut.
Android 10 lub nowszy:
Obowiązują te same limity ograniczeń co w Androidzie 9. Dostępna jest nowa opcja dla programistów aby wyłączyć ograniczanie na potrzeby testów lokalnych (w sekcji Opcje programisty > Sieć > ograniczanie skanowania Wi-Fi).