要求用户连接到特定的WiFi扑动



我需要将用户的设备连接到特定的WiFi。我已经使用了一些软件包,如wifi_iot,但根据谷歌,在Android API版本>我们不能直接将用户设备连接到特定的WiFi。相反,谷歌建议使用WifiNetworkSuggestion

我有两个选项:

  1. 在flutter中使用MethodChannel,在Kotlin中实现WifiNetworkSuggestion,并在我的项目中使用它。
  2. 通知用户手动连接到我的特定wifi(当然我必须向用户显示密码)。
    你推荐这些选项中的哪一个?我没有任何实施方案一的经验。是否有可能在颤振项目中实现这样的东西?如果你能想出另一个选择,我很乐意与我分享。

对于任何想要在flutter中实现类似内容的人:在Android API版本29之前,您可以直接将用户的设备连接到特定的WiFi,而不会出现任何问题。但在API版本29之后(Android>= 10),你不能这样做。你必须询问用户是否想要连接你的WiFi。因此,例如在flutter(注意:你不能要求用户直接在dart代码连接到wifi。因此,您必须用Kotlin或Java编写逻辑),您必须定义平台并配置通道以运行Kotlin或Java代码。(编写定制的特定于平台的代码

之后你可以这样写:

import io.flutter.embedding.android.FlutterActivity
import androidx.annotation.NonNull
import android.net.wifi.WifiNetworkSpecifier
import android.net.wifi.WifiConfiguration
import android.net.wifi.WifiManager
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import android.os.PatternMatcher
import android.net.NetworkRequest
import android.net.NetworkCapabilities
import android.content.Context
import android.net.ConnectivityManager
import android.net.Network
import android.util.Log

class MainActivity: FlutterActivity() {
private val CHANNEL = "channelname/wifiworks"
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
call, result ->
if (call.method == "getTest") {
val temp = getTest(call.argument<String>("SSID").toString())

result.success(temp)
// Note: this method is invoked on the main thread.
// TODO
}
if(call.method == "dc") {
val temp = disconnect()

result.success(temp)
}
}
}
private fun disconnect(): Int {
if(android.os.Build.VERSION.SDK_INT >= 29)
{
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
connectivityManager.unregisterNetworkCallback(mNetworkCallback)
}
return 3434;
}
private val mNetworkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
//phone is connected to wifi network
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
connectivityManager.bindProcessToNetwork(network)
}
}
private fun getTest(ssid: String): Int {
if(android.os.Build.VERSION.SDK_INT >= 29)
{
val specifier = WifiNetworkSpecifier.Builder()
// .setSsidPattern(PatternMatcher("SSID", PatternMatcher.PATTERN_PREFIX))
.setSsid(ssid)
.setWpa2Passphrase("Your_Password")
.build()
val request = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.setNetworkSpecifier(specifier)
.build()
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

connectivityManager.requestNetwork(request, mNetworkCallback)
// Release the request when done.
//
return 123
}
else {
var networkSSID = ssid;
var networkPass = "Your_Password";
var conf = WifiConfiguration()
conf.SSID = """ + networkSSID + """
conf.preSharedKey = """+ networkPass +"""
var wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager
var netid = wifiManager.addNetwork(conf)
wifiManager.disconnect()
wifiManager.enableNetwork(netid, true)
wifiManager.reconnect()
return ssid.length

}

}
}

希望对你有帮助;)

最新更新