当前位置: 首页 > 知识库问答 >
问题:

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

公孙锋
2023-03-14

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

代码片段

主要活动。kt

类主活动:AppCompat活动(){

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/以编程方式执行

参考:参考:是否可以在Android Q上html" target="_blank">添加网络配置?

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

共有2个答案

欧阳昊焱
2023-03-14

注意:此方法仅适用于只要你不目标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);
   }
刁远
2023-03-14

您可以使用新设置,温和地要求用户打开wifi。面板(API 29)或旧的设置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)
    }
} 
 类似资料:
  • 我实际上是在编程一些东西,不让用户访问Android原生wifi连接页面,所以我在我的Android应用程序中编程。它扫描可用的无线网络,将其显示在列表视图中,然后单击要连接的网络。 事实上,除了我的连接功能之外,一切都很好,这使得我的应用程序崩溃,所以如果你有任何想法...下面是代码(这是用户输入网络通行证后调用的函数)和堆栈跟踪: 堆栈跟踪:

  • 我正在开发一个应用程序,其中我需要的第一件事是如何获得连接到我的wifi网络或相同wifi网络的设备。即IP地址、设备名称等。我不知道如何做到这一点已经搜索了很多,但没有可用的示例。 我做了一件事,我将ping 255个ip,无论哪个将响应,都将是连接的ip,但这里的问题是,有些网站已经分配了虚拟ip,因此我只需要检测真实的设备ip地址。 我想做与应用程序WifiTalkie中所做的相同的事情

  • 一直在努力连接到WiFi网络在Android 5和6一段时间和其他类似的问题似乎不适合我。我可以得到相同的代码工作在Android 4.4.2 添加下面的代码片段。 这是我注意到的。 我是经理。添加网络(配置) 返回一些()整数与Android 5(手机)和Android 6(标签). 但是,除非我打开wifi设置(我不需要做任何事情,只要在那里登陆即可连接),或者我从顶部栏手动关闭并打开wifi

  • 问题内容: 连接网络后如何向用户显示缓慢的Internet连接注意:不是网络类型(2G,3G,4G,WIFI) 问题答案: 确定您的网络速度-(缓慢的Internet速度) 使用NetworkInfo类,ConnectivityManager和TelephonyManager确定您的网络类型。 从互联网上下载任何文件,并计算花费了多长时间与文件中的字节数。(确定速度检查的唯一方法) 我已经为我的项

  • 我在Android应用程序,涉及连接一个特定的WiFi SSID没有密码。每当用户进入应用程序时,应用程序都会通过BLE检测特定的信标。之后,该应用程序尝试使用WifiManager连接应用程序代码中编程的WiFi。在这里,我面临一些问题: 1)如果WiFi已经禁用在手机-应用程序启用WiFi并尝试连接到已经配置的WiFi(可能是字母顺序)。在这种情况下,它可能会连接另一个可用的WiFi,并在手机

  • 在最新版本的Android(尤其是Pixel)上处理Wifi Manager时,我看到了一些有趣的行为。我正在尝试使WIFI manager连接到已知的热点(IOT设备)。 谷歌在一篇博客文章中清楚地列出了这些步骤,如果你在Lollipop上,你需要绑定到一个特定的网络,以确保你的网络请求通过一个给定的网络。你可以在这里找到步骤https://android-developers.googlebl