要求用户连接到特定的 WiFi flutter
Ask user to connect to a specific WiFi flutter
我需要将用户的设备连接到特定的 WiFi。我使用了一些包,如 wifi_iot 但根据 google,在 Android API 版本 > 29 中,我们无法直接将用户设备连接到特定的 WiFi。
相反 google 建议使用 WifiNetworkSuggestion
我有两个选择:
- 在flutter中使用MethodChannel,在Kotlin中实现WifiNetworkSuggestion,并在我的项目中使用。
- 通知用户手动连接到我的特定wifi(当然我必须向用户显示密码)。
您推荐以下哪个选项?
而且我没有实施选项 1 的任何经验。是否可以在 flutter 项目中实施类似的东西?
如果您能提出其他选择,我很乐意与我分享。
任何想要在 flutter 中实现类似功能的人:在 Android API 版本 29 之前,您可以直接将用户的设备连接到特定的 WiFi,没有任何问题。但是在 API 29 之后的版本 (Android >= 10) 中,你不能这样做。您必须询问用户 he/she 是否要连接到您的 WiFi。因此,例如在 flutter 中(注意:你不能要求用户直接在 dart 代码中连接到 wifi。所以你必须在 Kotlin 或 Java 中编写你的逻辑)你必须定义平台并将频道配置为 运行 kotlin 或 java 代码。 (Writing custom platform-specific code
之后你可以有这样的东西:
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
}
}
}
希望这对您有所帮助 ;)
我需要将用户的设备连接到特定的 WiFi。我使用了一些包,如 wifi_iot 但根据 google,在 Android API 版本 > 29 中,我们无法直接将用户设备连接到特定的 WiFi。 相反 google 建议使用 WifiNetworkSuggestion
我有两个选择:
- 在flutter中使用MethodChannel,在Kotlin中实现WifiNetworkSuggestion,并在我的项目中使用。
- 通知用户手动连接到我的特定wifi(当然我必须向用户显示密码)。
您推荐以下哪个选项? 而且我没有实施选项 1 的任何经验。是否可以在 flutter 项目中实施类似的东西? 如果您能提出其他选择,我很乐意与我分享。
任何想要在 flutter 中实现类似功能的人:在 Android API 版本 29 之前,您可以直接将用户的设备连接到特定的 WiFi,没有任何问题。但是在 API 29 之后的版本 (Android >= 10) 中,你不能这样做。您必须询问用户 he/she 是否要连接到您的 WiFi。因此,例如在 flutter 中(注意:你不能要求用户直接在 dart 代码中连接到 wifi。所以你必须在 Kotlin 或 Java 中编写你的逻辑)你必须定义平台并将频道配置为 运行 kotlin 或 java 代码。 (Writing custom platform-specific code
之后你可以有这样的东西:
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
}
}
}
希望这对您有所帮助 ;)