You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Flutter开发Android WiFi DNS修改应用的技术求助

修改Android WiFi DNS的Flutter解决方案

目前没有成熟的Flutter插件直接支持修改Android设备的WiFi DNS配置,这类系统级操作需要通过平台通道(Platform Channel)调用Android原生代码实现,以下是具体方案:

1. 权限配置

首先在android/app/src/main/AndroidManifest.xml中添加必要权限:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- Android 10+ 必需 -->
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:usesPermissionFlags="neverForLocation" /> <!-- Android 12+ 必需 -->

同时在Flutter端动态申请权限(可使用permission_handler库),确保权限获取成功后再执行DNS修改操作。

2. 原生Android代码实现

在Android项目的MainActivity.kt中注册MethodChannel,编写修改DNS的逻辑:

import android.content.Context
import android.net.wifi.WifiConfiguration
import android.net.wifi.WifiManager
import java.net.InetAddress
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity : FlutterActivity() {
    private val CHANNEL = "com.your_package_name/wifi_dns"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            when (call.method) {
                "updateDnsServers" -> {
                    val dnsList = call.argument<List<String>>("dnsServers") ?: emptyList()
                    val success = updateCurrentWifiDns(dnsList)
                    result.success(success)
                }
                else -> result.notImplemented()
            }
        }
    }

    private fun updateCurrentWifiDns(dnsServers: List<String>): Boolean {
        val wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
        val currentNetworkId = wifiManager.connectionInfo.networkId
        
        // 获取当前连接的WiFi配置
        val targetConfig = wifiManager.configuredNetworks?.firstOrNull { it.networkId == currentNetworkId }
            ?: return false

        // 更新DNS服务器列表
        targetConfig.dnsServers.clear()
        dnsServers.forEach { dns ->
            try {
                targetConfig.dnsServers.add(InetAddress.getByName(dns))
            } catch (e: Exception) {
                return false // DNS格式错误直接返回失败
            }
        }

        // 提交配置更新并重新连接
        val updateResult = wifiManager.updateNetwork(targetConfig)
        return if (updateResult != -1) {
            wifiManager.saveConfiguration()
            wifiManager.disconnect()
            wifiManager.reconnect()
            true
        } else {
            false
        }
    }
}

3. Flutter端调用代码

创建工具类调用原生方法:

import 'package:flutter/services.dart';

class WifiDnsHelper {
  static const MethodChannel _channel = MethodChannel('com.your_package_name/wifi_dns');

  /// 修改当前连接WiFi的DNS服务器
  /// [dnsServers] 是DNS地址列表,例如 ["8.8.8.8", "8.8.4.4"]
  static Future<bool?> updateDnsServers(List<String> dnsServers) async {
    try {
      return await _channel.invokeMethod(
        'updateDnsServers',
        {'dnsServers': dnsServers},
      );
    } on PlatformException catch (e) {
      print('DNS修改失败: ${e.message}');
      return false;
    }
  }
}

版本兼容性说明

  • Android 9及以下:上述代码可直接生效,确保权限申请完成即可。
  • Android 10-11:必须获取ACCESS_FINE_LOCATION权限,部分设备可能需要用户手动确认修改操作。
  • Android 12+:需添加NEARBY_WIFI_DEVICES权限,且部分定制ROM可能存在额外限制,建议测试不同设备的兼容性。

注意事项

  • 部分厂商的定制系统可能限制第三方应用修改WiFi配置,这种情况下只能引导用户手动进入系统WiFi设置修改DNS。
  • 若应用需要更稳定的DNS修改能力,可考虑在root设备上操作,但普通设备需严格遵循权限规则。

内容的提问来源于stack exchange,提问作者Nguyen Le Anh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 22:12:36