【问题标题】:Connecting to a specific wifi network programmatically in Android (API 30)在 Android (API 30) 中以编程方式连接到特定的 wifi 网络
【发布时间】:2020-12-26 20:23:41
【问题描述】:

目的 尝试在没有任何人为干预(用户名和密码除外)的情况下连接或切换到特定的 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 步/以编程方式进行操作

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

为了明确一点,这段代码sn-p中提到的ssid和密码是默认AVD的,只需将其更改为任何其他WiFi网络的SSID和密码,它可以在物理设备上使用。我在 Pixel 3XL 上尝试过同样的问题。

【问题讨论】:

    标签: android kotlin android-wifi


    【解决方案1】:

    您可以使用新的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)
        }
    } 
    

    【讨论】:

    • 这听起来不像是对客户/客户的合法要求。如果我看到设置应用程序,它能够在 WiFi 网络之间切换,而无需任何其他人为干预。如果您有生产软件方面的经验,请提出建议。
    • @AvijitDas 对于 API 29+,Settings.Panel.ACTION_WIFI 将向您显示 Wi-Fi 选择,而不会占用您的整个屏幕。恕我直言,这仍然比让setWifiEnabled(true) 的电话对您无济于事要好!因此,代码中的 if-else 块 :)
    • 谢谢你的建议,让我试试。
    • 谢谢 Siddharth,这可能会解决问题 :) 有没有办法阻止通知?
    • @AvijitDas 您指的是setWifiEnabled(true) 警告通知吗?如果是,那么我不知道有什么方法可以禁用它。
    【解决方案2】:

    注意:此方法仅适用于您不针对 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);
       }
    

    【讨论】:

    • 感谢阿里的快速响应。我正在 API 30 上尝试它。有什么方法可以实现我在 API 30 上尝试的功能。我检查了 setWifiEnabled 自 API 29 以来已弃用。
    • 没错它已被弃用
    • 我不认为有任何解决方法,但您可以在 API 30 以下和 API 30 的手动功能中做到这一点
    • 当然可以,我可以试试。再次感谢您。
    • 此代码适用于 API 28 及以下版本。我还是想在 29 及以上有解决方案。
    猜你喜欢
    • 1970-01-01
    • 2016-05-02
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多