要求用户连接到特定的 WiFi flutter

Ask user to connect to a specific WiFi flutter

我需要将用户的设备连接到特定的 WiFi。我使用了一些包,如 wifi_iot 但根据 google,在 Android API 版本 > 29 中,我们无法直接将用户设备连接到特定的 WiFi。 相反 google 建议使用 WifiNetworkSuggestion

我有两个选择:

  1. 在flutter中使用MethodChannel,在Kotlin中实现WifiNetworkSuggestion,并在我的项目中使用。
  2. 通知用户手动连接到我的特定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
            
        }

        
    }
}

希望这对您有所帮助 ;)