Participe do evento ⁠#Android11: apresentação de lançamento da versão Beta no dia 3 de junho.

Visão geral da verificação de Wi-Fi

Você pode usar os recursos de verificação de Wi-Fi fornecidos pela API WifiManager para ver uma lista dos pontos de acesso Wi-Fi no dispositivo.

Processo de verificação de Wi-Fi

Há três etapas para o processo de verificação:

  1. Faça registro de um listener de transmissão para SCAN_RESULTS_AVAILABLE_ACTION, que é chamado quando as solicitações de verificação são concluídas, fornecendo o status de conclusão/falha. Para dispositivos que executam Android 10 (nível de API 29) e versões superiores, essa transmissão será enviada para qualquer verificação de Wi-Fi completa realizada no dispositivo, seja pela plataforma ou por outros aplicativos. Com a transmissão, os aplicativos podem interceptar passivamente todas as conclusões da verificação no dispositivo sem emitir uma verificação própria.

  2. Solicite uma verificação usando WifiManager.startScan(). Verifique o status de retorno do método, já que a chamada pode falhar por qualquer um dos seguintes motivos:

    • As solicitações talvez sejam limitadas devido à realização de muitas verificações em pouco tempo.
    • O dispositivo está ocioso, e a verificação está desativada.
    • O hardware Wi-Fi relata uma falha na verificação.
  3. Acesse os resultados da verificação usando WifiManager.getScanResults(). Os resultados da verificação retornados indicam os dados mais recentes, mas podem ser referentes a uma verificação anterior, caso a atual não tenha sido concluída. Isso significa que você poderá acessar resultados da verificação mais antigos se chamar esse método antes de receber uma transmissão SCAN_RESULTS_AVAILABLE_ACTION.

O código a seguir fornece um exemplo de como implementar essas etapas:

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

Restrições

O Android 8.0 (nível 26 da API) introduziu restrições sobre permissões e a frequência de verificações de Wi-Fi permitida.

Para melhorar o desempenho da rede, a segurança e a duração da bateria, o Android 9 (nível 28 da API) reforçou os requisitos de permissão e limitou ainda mais a frequência das verificações de Wi-Fi.

Permissões

Android 8.0 e Android 8.1:

Uma chamada bem-sucedida para WifiManager.getScanResults() exige uma das permissões a seguir:

Se o aplicativo não tiver nenhuma dessas permissões, a chamada falhará com um SecurityException.

Android 9:

Uma chamada bem-sucedida para WifiManager.startScan() exige que todas as condições a seguir sejam atendidas:

Android 10 (nível de API 29) e versões superiores:

Uma chamada bem-sucedida para WifiManager.startScan() exige que todas as condições a seguir sejam atendidas:

  • Se o aplicativo direcionar o SDK Android 10 (nível de API 29) ou versão posterior, ele terá a permissão ACCESS_FINE_LOCATION.
  • Se o aplicativo direcionar um SDK anterior a Android 10 (nível de API 29), ele terá a permissão ACCESS_COARSE_LOCATION ou ACCESS_FINE_LOCATION.
  • O aplicativo tem a permissão CHANGE_WIFI_STATE.
  • Os serviços de localização são ativados no dispositivo em Configurações > Local.

Para chamar WifiManager.getScanResults(), verifique se todas as condições a seguir são atendidas:

  • Se o aplicativo direcionar o SDK Android 10 (nível de API 29) ou versão posterior, ele terá a permissão ACCESS_FINE_LOCATION.
  • Se o aplicativo direcionar um SDK anterior a Android 10 (nível de API 29), ele terá a permissão ACCESS_COARSE_LOCATION ou ACCESS_FINE_LOCATION.
  • O aplicativo tem a permissão ACCESS_WIFI_STATE.
  • Os serviços de localização são ativados no dispositivo em Configurações > Local.

Para chamar WifiManager.getScanResults(), verifique se todas as condições a seguir são atendidas:

Se o aplicativo de chamada não atender a todos esses requisitos, a chamada falhará com um SecurityException.

Limitação

As seguintes limitações se aplicam à frequência de verificações usando WifiManager.startScan().

Android 8.0 e Android 8.1:

Os aplicativos em segundo plano podem fazer uma verificação a cada 30 minutos.

Android 9:

Os aplicativos em primeiro plano podem fazer quatro verificações a cada 2 minutos. Isso permite a ocorrência de um burst de verificações em pouco tempo.

Todos os aplicativos em segundo plano combinados podem fazer uma verificação a cada 30 minutos.

Android 10 e versões posteriores:

São aplicadas as mesmas limitações do Android 9. Há uma nova opção de desenvolvedor para alternar o limite para testes locais em Opções do desenvolvedor > Rede > Limitação da verificação de Wi-Fi).