Panoramica della ricerca di reti Wi-Fi

Puoi utilizzare le funzionalità di ricerca di reti Wi-Fi fornite API WifiManager per visualizzare un elenco Punti di accesso Wi-Fi visibili dal dispositivo.

Procedura di ricerca di reti Wi-Fi

La procedura di scansione è composta da tre passaggi:

  1. Registra un listener di trasmissione per SCAN_RESULTS_AVAILABLE_ACTION, che viene chiamato al completamento delle richieste di scansione, fornendo riuscito/non riuscito. Per i dispositivi con Android 10 (livello API 29) e versioni successive, questo verrà inviato per qualsiasi ricerca Wi-Fi completa eseguita sul dispositivo la piattaforma o altre app. Le app possono ascoltare passivamente tutte le scansioni i completamenti sul dispositivo utilizzando la trasmissione senza emettere una scansione dei personali.

  2. Richiedi una scansione utilizzando WifiManager.startScan() Assicurati di controllare lo stato restituito del metodo, poiché la chiamata potrebbe non riuscire per uno dei seguenti motivi:

    • Le richieste di scansione potrebbero essere limitate a causa di troppe analisi in un breve periodo di tempo.
    • Il dispositivo è inattivo e la scansione è disattivata.
    • L'hardware Wi-Fi segnala un errore di ricerca.
  3. Ottieni i risultati della scansione utilizzando WifiManager.getScanResults() I risultati della scansione restituiti sono i risultati aggiornati più di recente, che potrebbero essere provenire da una scansione precedente, se la scansione attuale non è stata completata o non è andata a buon fine. Ciò significa che potresti ricevere risultati della scansione meno recenti se chiami questo metodo prima di ricevere un SCAN_RESULTS_AVAILABLE_ACTION la trasmissione.

Il codice riportato di seguito fornisce un esempio di come implementare questi passaggi:

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 ...
}

Restrizioni

Android 8.0 (livello API 26) ha introdotto limitazioni relative alle autorizzazioni e frequenza consentita di ricerche di reti Wi-Fi.

Per migliorare le prestazioni della rete, la sicurezza e la durata della batteria, Android 9 (API livello 28) ha rafforzato i requisiti di autorizzazione e limitato ulteriormente la frequenza Ricerche di reti Wi-Fi.

Autorizzazioni

Android 8.0 e Android 8.1:

Chiamata andata a buon fine a WifiManager.getScanResults() richiede una qualsiasi delle seguenti autorizzazioni:

Se l'app per le chiamate non dispone di nessuna di queste autorizzazioni, la chiamata non riesce con un SecurityException

In alternativa, sui dispositivi con Android 8.0 (livello API 26) e versioni successive, puoi: utilizza la CompanionDeviceManager eseguire un'analisi dei dispositivi associati nelle vicinanze per conto della tua app senza che richiedono l'autorizzazione di accesso alla posizione. Per ulteriori informazioni su questa opzione, vedi Dispositivo associato accoppiamento rapido.

Android 9:

Chiamata andata a buon fine a WifiManager.startScan() richiede che vengano soddisfatte tutte le seguenti condizioni:

Android 10 (livello API 29) e versioni successive:

Chiamata andata a buon fine a WifiManager.startScan() richiede che vengano soddisfatte tutte le seguenti condizioni:

  • Se la tua app ha come target l'SDK per Android 10 (livello API 29) o versioni successive, la tua app ha ACCESS_FINE_LOCATION autorizzazione.
  • Se la tua app ha come target l'SDK precedente ad Android 10 (livello API 29), la tua app ha ACCESS_COARSE_LOCATION oppure ACCESS_FINE_LOCATION autorizzazione.
  • La tua app include CHANGE_WIFI_STATE autorizzazione.
  • I servizi di geolocalizzazione siano attivi sul dispositivo (in Impostazioni >) Località).

Per chiamare correttamente WifiManager.getScanResults(), Assicurati che vengano soddisfatte tutte le seguenti condizioni:

  • Se la tua app ha come target l'SDK per Android 10 (livello API 29) o versioni successive, la tua app ha l'autorizzazione ACCESS_FINE_LOCATION.
  • Se la tua app ha come target l'SDK precedente ad Android 10 (livello API 29), la tua app ha l'autorizzazione ACCESS_COARSE_LOCATION o ACCESS_FINE_LOCATION.
  • La tua app ha ACCESS_WIFI_STATE autorizzazione.
  • I servizi di geolocalizzazione siano attivi sul dispositivo (in Impostazioni >) Località).

Se l'app per le chiamate non soddisfa tutti questi requisiti, la chiamata non riesce con Un SecurityException.

Limitazione

Le seguenti limitazioni si applicano alla frequenza delle scansioni con WifiManager.startScan()

Android 8.0 e Android 8.1:

Ogni app in background può eseguire la scansione una volta in un periodo di 30 minuti.

Android 9:

Ogni app in primo piano può eseguire quattro scansioni in un periodo di 2 minuti. Ciò consente serie di scansioni in breve tempo.

Tutte le app in background combinate possono eseguire la scansione una volta in un periodo di 30 minuti.

Android 10 e versioni successive:

Si applicano gli stessi limiti di limitazione di Android 9. È disponibile una nuova opzione sviluppatore per disattivare la limitazione per i test locali (in Opzioni sviluppatore > Networking > limitazione della ricerca di reti Wi-Fi).