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

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

Processo de busca por Wi-Fi

Há três etapas para o processo de busca:

  1. Faça registro de um listener de transmissão para SCAN_RESULTS_AVAILABLE_ACTION, que é chamado quando as solicitações de busca são concluídas, fornecendo o status de conclusão/falha. Para dispositivos que executam o Android 10 (API de nível 29) e versões mais recentes, essa transmissão será enviada para qualquer busca por 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 busca no dispositivo sem emitir uma busca própria.

  2. Solicite uma busca 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 buscas em pouco tempo.
    • O dispositivo está ocioso, e a busca está desativada.
    • O hardware Wi-Fi relata uma falha na busca.
  3. Veja os resultados da busca usando WifiManager.getScanResults(). Os resultados da busca retornados indicam os dados mais recentes, mas podem ser referentes a uma busca anterior, caso a atual não tenha sido concluída. Isso significa que você poderá acessar resultados de busca 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 buscas por 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 buscas por Wi-Fi.

Permissões

Android 8.0 e Android 8.1:

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

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

Como alternativa, em dispositivos com Android 8.0 (API de nível 26) e versões mais recentes, é possível usar o CompanionDeviceManager para executar uma busca de dispositivos complementares nas proximidades em nome do seu app sem precisar de permissão de localização. Para saber mais sobre essa opção, consulte Pareamento de dispositivo complementar.

Android 9:

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

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

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

  • Se o app for destinado ao SDK do Android 10 (API de nível 29) ou mais recente, ele terá a permissão ACCESS_FINE_LOCATION.
  • Se o app for destinado ao SDK anterior ao Android 10 (API de nível 29), ele terá a permissão ACCESS_COARSE_LOCATIONou ACCESS_FINE_LOCATION.
  • O aplicativo tem a permissão CHANGE_WIFI_STATE.
  • Os serviços de localização estã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 for destinado ao SDK do Android 10 (API de nível 29) ou mais recente, ele terá a permissão ACCESS_FINE_LOCATION.
  • Se o aplicativo for destinado a um SDK anterior ao Android 10 (API de nível 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 estão ativados no dispositivo em Configurações > Local.

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 buscas que usam WifiManager.startScan().

Android 8.0 e Android 8.1:

Os aplicativos em segundo plano podem fazer uma busca a cada 30 minutos.

Android 9:

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

Todos os aplicativos em segundo plano combinados podem fazer uma busca a cada 30 minutos.

Android 10 e mais recentes:

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 > Limitar busca por Wi-Fi.