【问题标题】:Ask user to connect to a specific WiFi flutter要求用户连接到特定的 WiFi 颤振
【发布时间】:2021-08-24 09:01:13
【问题描述】:

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

我有两个选择:

  1. 在 Flutter 中使用 MethodChannel,在 Kotlin 中实现 WifiNetworkSuggestion 并在我的项目中使用。
  2. 通知用户手动连接到我的特定wifi(当然我必须向用户显示密码)。
    您推荐以下哪些选项? 而且我在实施选项1方面没有任何经验。是否可以在颤振项目中实施这样的事情? 如果您能提出其他选择,我很乐意与我分享。

【问题讨论】:

  • 抱歉,迟到的评论,我是 wifi_iot 的维护者 - 它在内部同时使用 Wi-Fi Network Request APIWi-Fi suggestion API 用于 API > 29。

标签: flutter dart wifi


【解决方案1】:

对于任何想要在 Flutter 中实现类似功能的人:在 Android API 版本 29 之前,您可以直接将用户的设备连接到特定的 WiFi,没有任何问题。但在 29 (Android >= 10) 之后的 API 版本中,您不能这样做。您必须询问用户他/她是否想连接到您的 WiFi。所以例如在颤振中(注意:你不能要求用户直接在 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
            
        }

        
    }
}

希望这会有所帮助;)

【讨论】:

    猜你喜欢
    • 2020-10-15
    • 2021-04-12
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多