Conectando-se a uma rede wi-fi específica de maneira programática no Android (API 30)
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:
- Execute o aplicativo e clique no botão na tela inicial para se conectar ao WiFi.
- Vá para as configurações, desative e ative o WiFi
- 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
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)
}
}
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);
}