dart 如何强制flutter使用wifi而非4G?

wgxvkvu9  于 2023-03-10  发布在  Flutter
关注(0)|答案(4)|浏览(236)

我的应用可以进行本地网络呼叫。有没有办法通过flutter/dart强制http.get()通过WiFi(即使互联网不可用)而不是3G/4G?

ecr0jaav

ecr0jaav1#

Core Flutter框架还没有这个特性(而且至少在很长一段时间内不会有)。
当涉及到硬件相关的东西,你几乎可以说,本机代码是唯一的出路。好事情是有许多官方和第三方软件包已经为您做了这项工作。
例如,这个软件包是连接相关功能的热门软件包:https://pub.dev/packages/connectivity
这是您需要的示例代码:

import 'package:connectivity/connectivity.dart';

var connectivityResult = await (Connectivity().checkConnectivity());
if (connectivityResult == ConnectivityResult.mobile) {
  // I am connected to a mobile network.
} else if (connectivityResult == ConnectivityResult.wifi) {
  // I am connected to a wifi network.
}
6yoyoihd

6yoyoihd2#

有一个插件可以帮助您解决这个问题。
您需要将此https://github.com/alternadom/WiFiFlutter插件添加到您的项目中,如下所示:

wifi_iot:
    git: https://github.com/alternadom/WiFiFlutter.git

然后强制使用wifi

WiFiForIoTPlugin.forceWifiUsage(true);

我做了安全措施还加了站台检查

import 'dart:io' show Platform;
if(Platform.isAndroid) {
   WiFiForIoTPlugin.forceWifiUsage(true);
}

缺点是,当你第一次在应用程序中这样做时,用户将被重定向,允许应用程序更改系统设置(从那里开始,“后退”导航按钮暂时不起作用)。

vh0rcniy

vh0rcniy3#

这在flutter上是不可能的,唯一的方法是通过paltform-channels使用平台原生代码。
https://flutter.dev/docs/development/platform-integration/platform-channels

ckocjqey

ckocjqey4#

这个问题只在安卓设备上出现(在iOS设备上不会出现)。Eric是对的。你可以通过平台通道来实现这个问题。在你的项目中,你可以找到MainActivity.kt文件,它通常位于android -〉app -〉src -〉main -〉Kotlin
我想出了这个解决方案,你必须使用连接管理器绑定你的网络,并创建通道来调用它在你的flutter应用程序

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

class MainActivity: FlutterActivity() {
    private val channel = "ru.myPackageName.mobile/bindNetworkToWifi"

    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, channel).setMethodCallHandler {
                _, _ ->
                bindNetworkToWifi()
        }
    }

  private fun bindNetworkToWifi() {
      val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
      val builder = NetworkRequest.Builder()
      builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
      builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
      builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
      connectivityManager.requestNetwork(builder.build(), object : ConnectivityManager.NetworkCallback() {
          override fun onAvailable(network: Network) {
              if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                  connectivityManager.bindProcessToNetwork(network)
                  Log.d("Forced wifi usage", "onAvailable: true")
              }
          }
      })
  }
}

我在闪屏中调用的flutter代码

final platform = MethodChannel('ru.myPackageName.mobile/bindNetworkToWifi');

  Future<void> _bindNetworkToWifi() async {
    try {
      platform.invokeMethod('bindNetworkToWifi');
      debugPrint("seems to be working: 'bindNetworkToWifi'.");
    } on PlatformException catch (e) {
      debugPrint("Failed to force wifi usage: '${e.message}'.");
    }
  }

更多信息请参见here

相关问题