我正在开发一种用户必须遵循以下步骤的应用程序:
当用户连接到连接对象的专用热点时,应用程序会执行一些HTTP请求以对其进行配置。然后,我想自动将应用程序重新连接到步骤1的全局wifi。
从API 21到API 28,此功能非常易于实现,因为我知道我想重新连接手机的SSID。只需几行代码即可完成:
private fun changeCurrentWifiNetworkLegacy(ssidToConnect: String) {
val wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
var ssidIdentifier: Int? = null
wifiManager.configuredNetworks?.forEach { config ->
Log.d("SSID", config.SSID)
if (config.SSID == "\"${ssidToConnect}\"") {
ssidIdentifier = config.networkId
}
}
ssidIdentifier?.let { id ->
wifiManager.enableNetwork(id, true)
}
}
在API 29上,根据本文,此简单代码不再起作用:https://developer.android.com/about/versions/10/privacy/changes#configure-wifi
根据该文章,现在,我应该使用2个类:WifiNetworkSpecifier
和/或WifiNetworkSuggestion
。
不幸的是,我找不到使用这些类的有效示例,以便将用户连接到先前配置的SSID。
有人已经实现了吗?
谢谢您的帮助。
您可以使用以下代码设置要连接的网络:
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.Q) {
val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkRequest = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.setNetworkSpecifier(
WifiNetworkSpecifier.Builder()
.setSsid("My ssid")
.build()
)
.build()
cm.requestNetwork(networkRequest, object: ConnectivityManager.NetworkCallback() {
override fun onUnavailable() {
Log.d("TEST", "Network unavailable")
}
override fun onAvailable(network: Network) {
Log.d("TEST", "Network available")
}
})
}
这使用ConnectivityManager的networkRequest方法来请求具有特定SSID的网络。
此方法要求呼叫者持有Manifest.permission.CHANGE_NETWORK_STATE
权限或修改由Settings.System.canWrite(Context)
确定的系统设置的能力。
请参阅NetworkCallback类以获取有关可以获取哪些信息的更多文档。
((编辑:缺少添加运输类型。)
进一步编辑:我需要使用.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
使其正常工作。因为在WifiNetworkSpecifier
只能用于请求本地wifi网络(即没有互联网能力)
根据the docs
这给了我一个弹出设备的请求,但最终向我显示了我要求的Wifi网络。
Rolandl,您是否最终找到了“找不到设备..”的原因?我有完全一样的问题。