在AndroidAPI 30中以编程方式连接到特定的wifi网络

问题描述

目的 尝试在没有任何人工干预(用户名和密码除外)的情况下连接或切换到特定的WiFi网络。

代码

MainActivity.kt

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网络,而无需任何手动操作。

当前过程:

  1. 运行该应用程序,然后单击主屏幕上的按钮以连接到WiFi。
  2. 转到设置,禁用并启用WiFi
  3. 设备已连接到所需的WiFi网络

输出 https://i.stack.imgur.com/zQ7Bo.png

意图: 摆脱步骤2 /以编程方式完成

参考:Ref:Is it possible to add a network configuration on Android Q?

为了清楚起见,此代码段中提到的ssid和密码是认的AVD,只需将其更改为任何其他WiFi网络的SSID和密码,即可在物理设备上使用。我在Pixel 3XL上尝试了同样的问题。

解决方法

您可以使用新的Settings.Panel(API 29+)或旧的Settings API轻轻地要求用户打开wifi。此外,您可以使用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)
    }
} 
,

注意:仅当您不定位Android Q(API 29)及更高版本时,此方法才有效。

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

启用

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

要禁用

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