目的 尝试连接或切换到特定的WiFi网络,无需任何人工干预(除了用户名和密码)。
代码片段
MainActivity.kt
主要活动类: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()
}
}
AndroidManifest.xml 权限
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
使用此代码,设备可以连接到WiFi网络,但需要手动关闭和打开WiFi。必须有更好的方法来连接或切换到特定的WiFi网络,而无需任何手动操作。
当前过程:
1. 运行应用程序并在主屏幕上单击按钮以连接到WiFi。 2. 转到设置,禁用并启用WiFi 3. 设备连接到所需的WiFi网络。
Output https://istack.dev59.com/zQ7Bo.webp
意图: 摆脱第二步/以编程方式完成参考:Ref: 在 Android Q 上是否可以添加网络配置? 仅为明确起见,此代码片段中提到的 SSID 和密码是针对默认 AVD 的。只需将其更改为任何其他 WiFi 网络的 SSID 和密码即可,在物理设备上运行。我在 Pixel 3XL 上尝试过,出现了相同的问题。
Settings.Panel.ACTION_WIFI
将为您显示Wi-Fi选择,而不会占用整个屏幕。在我看来,这仍然比让setWifiEnabled(true)
的调用对您无效要好!因此,在代码中使用if-else块 :) - Siddharth KamariasetWifiEnabled(true)
的警告通知吗?如果是的话,那么我不知道有任何方法可以禁用它。 - Siddharth Kamaria