Conectando-se a uma rede wi-fi específica de maneira programática no Android (API 30)

Sep 08 2020

Objetivo Tente conectar ou mudar para uma rede WiFi específica sem qualquer intervenção humana (exceto nome de usuário e senha).

Fragmento de código

MainActivity.kt

classe MainActivity: AppCompatActivity () {

private var lastSuggestedNetwork:WifiNetworkSuggestion? = null
var wifiManager:WifiManager? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    wifiManager = applicationContext.getSystemService(WIFI_SERVICE) as WifiManager
    val button = findViewById<Button>(R.id.button) // Just a button in the layout file
    button.setOnClickListener(View.OnClickListener {
        wifiManager!!.disconnect()
        connectUsingNetworkSuggestion(ssid = "AndroidWifi", password ="")
        wifiManager!!.reconnect()
    })
}

private fun connectUsingNetworkSuggestion(ssid: String, password: String) {
    val wifiNetworkSuggestion = WifiNetworkSuggestion.Builder()
        .setSsid(ssid)
        .setWpa2Passphrase(password)
        .build()
    val intentFilter =
        IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION);

    val broadcastReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            if (!intent.action.equals(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) {
                return
            }
            showToast("Connection Suggestion Succeeded")
        }
    }


    registerReceiver(broadcastReceiver, intentFilter)

    lastSuggestedNetwork?.let {
        val status = wifiManager!!.removeNetworkSuggestions(listOf(it))
        Log.i("WifiNetworkSuggestion", "Removing Network suggestions status is $status") } val suggestionsList = listOf(wifiNetworkSuggestion) var status = wifiManager!!.addNetworkSuggestions(suggestionsList) Log.i("WifiNetworkSuggestion", "Adding Network suggestions status is $status")
    if (status == WifiManager.STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_DUPLICATE) {
        showToast("Suggestion Update Needed")
        status = wifiManager!!.removeNetworkSuggestions(suggestionsList)
        Log.i("WifiNetworkSuggestion", "Removing Network suggestions status is $status")
        status = wifiManager!!.addNetworkSuggestions(suggestionsList)
    }
    if (status == WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {
        lastSuggestedNetwork = wifiNetworkSuggestion
        showToast("Suggestion Added")
    }
}

private fun showToast(s: String) {
    Toast.makeText(applicationContext, s, Toast.LENGTH_LONG).show()
}

}

Permissão AndroidManifest.xml

 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

Com este código, o dispositivo é capaz de se conectar à rede WiFi, mas para isso o WiFi precisa ser desligado e ligado manualmente. Deve haver uma maneira melhor de conectar ou alternar para uma rede WiFi específica sem qualquer operação manual.

Processo atual:

  1. Execute o aplicativo e clique no botão na tela inicial para se conectar ao WiFi.
  2. Vá para as configurações, desative e ative o WiFi
  3. O dispositivo está conectado à rede WiFi desejada

Resultado https://i.stack.imgur.com/zQ7Bo.png

Intenção: livre-se da etapa 2 / faça-o programaticamente

Referência: Ref: É possível adicionar uma configuração de rede no Android Q?

Só para deixar claro, o ssid e a senha mencionados neste trecho de código são para o AVD padrão, basta alterá-lo para qualquer SSID e senha de outra rede WiFi, funciona em dispositivos físicos. Experimentei no Pixel 3XL com o mesmo problema.

Respostas

1 SiddharthKamaria Sep 09 2020 at 01:09

Você pode pedir gentilmente a seus usuários para ligar o wi-fi usando o novo Settings.Panel (API 29+) ou a antiga API de Configurações . Além disso, você pode usar startActivityForResult()para verificar se o usuário ativou o Wifi nas configurações.

if(!wifiManager.isWifiEnabled()) {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        startActivity(new Intent(Settings.Panel.ACTION_WIFI));
    } else {
        // Use a full page activity - if Wifi is critcal for your app
        startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
        // Or use the deprecated method
        wifiManager.setWifiEnabled(true)
    }
} 
Ali Sep 08 2020 at 19:41

Observação: este método só funciona enquanto você não tiver como alvo o Android Q (API 29) e superior.

e não, não há como automatizar o processo de habilitação.

Para Habilitar

    public void EnableWiFi(){
      wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
      wifiManager.setWifiEnabled(true);
   }

Desabilitar

 public void DisableWiFi(){
      wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
      wifiManager.setWifiEnabled(false);
   }