English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Detalhamento da operação forget() do Wifi do Android

Explicação detalhada da operação forget() do Wifi do Android

Ao lidar com uma conexão Wifi específica, às vezes precisamos esquecer as informações de senha da conexão atual. Para realizar essa operação, precisamos chamar a função WifiManager::forget():

/** 
 * Exclua a rede na configuração do supplicant. 
 * 
 * Esta função é usada em vez de uma sequência de removeNetwork() 
 * e salvarConfiguração(). 
 * 
 * @param config o conjunto de variáveis que descrevem a configuração, 
 *      contida em um objeto {@link WifiConfiguration}. 
 * @param listener para callbacks de sucesso ou falha. Pode ser null. 
 * @lança exceção IllegalStateException se a instância do WifiManager precisar ser 
 * inicializado novamente 
 * @hide 
 */ 
public void forget(int netId, ActionListener listener) { 
  if (netId < 0) throw new IllegalArgumentException("O id da rede não pode ser negativo"); 
  validateChannel(); 
  sAsyncChannel.sendMessage(FORGET_NETWORK, netId, putListener(listener)); 
} 

Pelo que se pode ver na descrição da função, ao chamar a função forget(), as informações de configuração da conexão de rede atual serão removidas do arquivo wpa_supplicant.conf; após isso, essa rede não terá a ação de reconexão automática, pois o arquivo conf não possui mais a configuração da rede.

Rastrear a mensagem FORGET_NETWORK, o tratamento do ClientHandler em WifiServiceImpl::

case WifiManager.FORGET_NETWORK: 
  if (isOwner(msg.sendingUid)) { 
    mWifiStateMachine.sendMessage(Message.obtain(msg)); 
  } else { 
    Slog.e(TAG, "Esquecer não está autorizado para o usuário"); 
    replyFailed(msg, WifiManager.FORGET_NETWORK_FAILED, 
        WifiManager.NOT_AUTHORIZED); 
  } 
  break; 

Simplesmente reencaminha a mensagem para o WifiStateMachine. Neste momento, o Wifi está conectado, o estado atual do WifiStateMachine é ConnectedState, e o estado pai ConnectModeState trata:

case WifiManager.FORGET_NETWORK: 
  // Apenas para depuração, lembrar da última configuração esquecida 
  WifiConfiguration toRemove 
      = mWifiConfigStore.getWifiConfiguration(message.arg1); 
  if (toRemove == null) { 
    lastForgetConfigurationAttempt = null; 
  } else { 
    lastForgetConfigurationAttempt = new WifiConfiguration(toRemove); 
  } 
  // check that the caller owns this network 
  netId = message.arg1; 
  if (!mWifiConfigStore.canModifyNetwork(message.sendingUid, netId, 
      /* onlyAnnotate */ false)) { 
    logw("Not authorized to forget network " 
       + " cnid=" + netId 
       + " uid=" + message.sendingUid); 
    replyToMessage(message, WifiManager.FORGET_NETWORK_FAILED, 
        WifiManager.NOT_AUTHORIZED); 
    break; 
  } 
  if (mWifiConfigStore.forgetNetwork(message.arg1)) { 
    replyToMessage(message, WifiManager.FORGET_NETWORK_SUCCEEDED); 
    broadcastWifiCredentialChanged(WifiManager.WIFI_CREDENTIAL_FORGOT, 
        (WifiConfiguration) message.obj); 
  } else { 
    loge("Failed to forget network"); 
    replyToMessage(message, WifiManager.FORGET_NETWORK_FAILED, 
        WifiManager.ERROR); 
  } 
  break; 

mWifiConfigStore.forgetNetwork():

/** 
 * Forget the specified network and save config 
 * 
 * @param netId network to forget 
 * @return {@code true} if it succeeds, {@code false} otherwise 
 */ 
boolean forgetNetwork(int netId) { 
  if (showNetworks) localLog("forgetNetwork", netId); 
  WifiConfiguration config = mConfiguredNetworks.get(netId); 
  boolean remove = removeConfigAndSendBroadcastIfNeeded(netId); 
  if (!remove) { 
    //sucesso, mas não queremos remover a rede do arquivo de configuração do supplicant 
    return true; 
  } 
  if (mWifiNative.removeNetwork(netId)) { 
    if (config != null && config.isPasspoint()) { 
      writePasspointConfigs(config.FQDN, null); 
    } 
    mWifiNative.saveConfig(); 
    writeKnownNetworkHistory(true); 
    return true; 
  } else { 
    loge("Falha ao remover a rede ") + netId); 
    return false; 
  } 
} 

De acordo com o netId atual transmitido, chamamos os métodos removeNetwork() e saveConfig() do WifiNative para excluir e salvar as informações de configuração do arquivo conf; após a execução, a função forget() encerrou. Através do código,我们发现执行 forget() não causará a transição de estado do WifiStateMachine.

Obrigado por ler, esperamos que ajude a todos, obrigado pelo apoio deste site!

Declaração: O conteúdo deste artigo é de origem na internet, pertencente ao respectivo detentor dos direitos autorais, e foi carregado voluntariamente pelos usuários da internet. Este site não possui direitos de propriedade, não foi editado artificialmente e não assume responsabilidade legal relevante. Se você encontrar conteúdo suspeito de infringência de direitos autorais, por favor, envie e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar e forneça provas. Em caso de confirmação, o site deletará imediatamente o conteúdo suspeito de infringência.)

Você também pode gostar