添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在安卓系统中以编程方式连接到特定的wifi网络(API 30)。

4 人关注

Purpose 尝试连接或切换到一个特定的WiFi网络,无需任何人工干预(除用户名和密码外)。

Code Snippet

主要活动.kt

class 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()

AndroidManifest.xml权限

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

有了这个代码,设备就能连接到WiFi网络,但为此需要手动关闭和打开WiFi。一定有更好的方法来连接或切换到一个特定的WiFi网络,而无需任何手动操作。

Current process:

  • Run the application and click on button on the home screen to connect to WiFi.
  • Go to settings, disable and enable to WiFi
  • Device is connect to the desired WiFi network
  • Output https://i.stack.imgur.com/zQ7Bo.png

    摆脱步骤#2/以编程方式进行

    Reference: Ref: 有可能在安卓Q上添加网络配置吗?

    为了明确起见,这段代码中提到的SSID和密码是针对默认AVD的,只要把它改成任何其他WiFi网络的SSID和密码,它就能在物理设备上工作。我在Pixel 3XL上试了一下,有同样的问题。

    android
    kotlin
    android-wifi
    Avijit Das
    Avijit Das
    发布于 2020-09-08
    2 个回答
    Siddharth Kamaria
    Siddharth Kamaria
    发布于 2020-09-08
    已采纳
    0 人赞同

    你可以通过使用新版的 "WIFI",轻轻地要求你的用户打开WIFI。 设置.面板 (API 29+)或旧的 Settings API。此外,你可以使用 startActivityForResult() 来检查用户是否在设置中打开了Wifi。

    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)
        
    这听起来不像是对客户/顾客的合法要求。如果我看到设置应用程序,它能够在WiFi网络之间切换,而没有任何其他的人为干预。如果你对生产软件有任何经验,请建议。
    @AvijitDas 对于API 29+, Settings.Panel.ACTION_WIFI 将显示你的Wi-Fi选择而不占用你的整个屏幕。IMHO,它仍然比让调用 setWifiEnabled(true) 为你做任何事情要好!因此,代码中的if-else块:)因此,代码中的if-else块:)
    谢谢你的建议,让我试试。
    谢谢你,Siddharth,这可能解决了问题:)有什么方法可以防止通知吗?
    @AvijitDas 你是指 setWifiEnabled(true) 的警告通知吗?如果是,那么我不知道有什么方法可以禁用它。
    Ali
    Ali
    发布于 2020-09-08
    0 人赞同

    Note: 只要你的目标不是安卓Q(API 29)及以上版本,这个方法就能发挥作用。

    而且,没有办法使启用过程自动化。

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