首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Android中以编程方式连接到特定的wifi网络(API 30)

在Android中以编程方式连接到特定的wifi网络(API 30)
EN

Stack Overflow用户
提问于 2020-09-08 12:35:23
回答 2查看 3.9K关注 0票数 4

试图连接或切换到特定的WiFi网络,而不需要任何人工干预(用户名和密码除外)。

代码片段

MainActivity.kt

类MainActivity : AppCompatActivity() {

代码语言:javascript
运行
复制
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权限

代码语言:javascript
运行
复制
 <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:可以在Android上添加网络配置吗?

为了说明清楚,这个代码段中提到的ssid和密码是默认的AVD,只需将其更改为任何其他WiFi网络的SSID和密码,它就可以在物理设备上工作。我在Pixel3XL上尝试了同样的问题。

EN

Stack Overflow用户

回答已采纳

发布于 2020-09-08 18:09:48

您可以通过使用新的Settings.Panel (API 29+)或旧的设置 API来温和地要求用户打开wifi。此外,您还可以使用startActivityForResult()来检查用户是否从设置中打开了Wifi。

代码语言:javascript
运行
复制
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)
    }
} 
票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63794081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档