using System;
using System.Collections.Generic;
using UnityEngine;
///
/// Android 网络配置器
/// 使用 Java 反射调用 Android WifiManager 和 DhcpInfo API 实现 DHCP/静态IP配置
/// 需要权限: android.permission.CHANGE_NETWORK_STATE, android.permission.ACCESS_WIFI_STATE, android.permission.CHANGE_WIFI_STATE
///
#if UNITY_ANDROID && !UNITY_EDITOR
public static class AndroidNetworkConfigurator
{
private static AndroidJavaObject _wifiManager;
private static AndroidJavaObject _connectivityManager;
private static AndroidJavaObject _currentActivity;
private static AndroidJavaClass _unityPlayer;
///
/// 初始化 Android 网络管理对象
///
private static void Initialize()
{
try
{
if (_wifiManager != null) return;
_unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
_currentActivity = _unityPlayer.GetStatic("currentActivity");
AndroidJavaObject context = _currentActivity.Call("getApplicationContext");
_wifiManager = context.Call("getSystemService", "wifi");
_connectivityManager = context.Call("getSystemService", "connectivity");
Debug.Log("[AndroidNetworkConfigurator] 初始化成功");
}
catch (Exception ex)
{
Debug.LogError($"[AndroidNetworkConfigurator] 初始化失败: {ex.Message}");
}
}
///
/// 应用 DHCP 配置
///
public static bool ApplyDhcp()
{
try
{
Initialize();
if (_wifiManager == null)
{
Debug.LogError("[AndroidNetworkConfigurator] WifiManager 为空,无法应用 DHCP");
return false;
}
// 获取 WifiManager.DhcpInfo
AndroidJavaObject dhcpInfo = _wifiManager.Call("getDhcpInfo");
if (dhcpInfo == null)
{
Debug.LogWarning("[AndroidNetworkConfigurator] 无法获取 DhcpInfo");
return false;
}
// 获取 WifiConfiguration
AndroidJavaObject wifiConfig = GetCurrentWifiConfiguration();
if (wifiConfig == null)
{
Debug.LogError("[AndroidNetworkConfigurator] 无法获取当前 WiFi 配置");
return false;
}
// 清除静态IP配置,启用DHCP
AndroidJavaClass ipAssignmentClass = new AndroidJavaClass("android.net.wifi.WifiConfiguration$IpAssignment");
AndroidJavaObject dhcpAssignment = ipAssignmentClass.GetStatic("DHCP");
wifiConfig.Set("ipAssignment", dhcpAssignment);
// 保存 WiFi 配置
int networkId = _wifiManager.Call("addNetwork", wifiConfig);
if (networkId == -1)
{
// 尝试更新已有配置
networkId = wifiConfig.Get("networkId");
_wifiManager.Call("updateNetwork", wifiConfig);
}
bool success = _wifiManager.Call("enableNetwork", networkId, true);
if (success)
{
Debug.Log($"[AndroidNetworkConfigurator] DHCP 配置已应用,NetworkId: {networkId}");
}
else
{
Debug.LogWarning($"[AndroidNetworkConfigurator] DHCP 配置应用失败");
}
return success;
}
catch (Exception ex)
{
Debug.LogError($"[AndroidNetworkConfigurator] 应用 DHCP 异常: {ex.Message}\n{ex.StackTrace}");
return false;
}
}
///
/// 应用静态 IP 配置
///
public static bool ApplyStaticIP(string ipAddress, string netmask, string gateway, string dns1, string dns2 = null)
{
try
{
Initialize();
if (_wifiManager == null)
{
Debug.LogError("[AndroidNetworkConfigurator] WifiManager 为空,无法应用静态 IP");
return false;
}
if (string.IsNullOrWhiteSpace(ipAddress) || string.IsNullOrWhiteSpace(netmask))
{
Debug.LogError("[AndroidNetworkConfigurator] IP 或子网掩码不能为空");
return false;
}
// 获取当前 WiFi 配置
AndroidJavaObject wifiConfig = GetCurrentWifiConfiguration();
if (wifiConfig == null)
{
Debug.LogError("[AndroidNetworkConfigurator] 无法获取当前 WiFi 配置");
return false;
}
// 设置IP分配方式为静态
AndroidJavaClass ipAssignmentClass = new AndroidJavaClass("android.net.wifi.WifiConfiguration$IpAssignment");
AndroidJavaObject staticAssignment = ipAssignmentClass.GetStatic("STATIC");
wifiConfig.Set("ipAssignment", staticAssignment);
// 创建 StaticIpConfiguration 对象
AndroidJavaObject staticIpConfig = CreateStaticIpConfiguration(ipAddress, netmask, gateway, dns1, dns2);
wifiConfig.Set("staticIpConfiguration", staticIpConfig);
// 保存 WiFi 配置
int networkId = _wifiManager.Call("addNetwork", wifiConfig);
if (networkId == -1)
{
networkId = wifiConfig.Get("networkId");
_wifiManager.Call("updateNetwork", wifiConfig);
}
bool success = _wifiManager.Call("enableNetwork", networkId, true);
if (success)
{
Debug.Log($"[AndroidNetworkConfigurator] 静态 IP 配置已应用\n" +
$" IP: {ipAddress}\n" +
$" Mask: {netmask}\n" +
$" Gateway: {gateway}\n" +
$" DNS1: {dns1}\n" +
$" DNS2: {(dns2 ?? "无")}\n" +
$" NetworkId: {networkId}");
}
else
{
Debug.LogWarning($"[AndroidNetworkConfigurator] 静态 IP 配置应用失败");
}
return success;
}
catch (Exception ex)
{
Debug.LogError($"[AndroidNetworkConfigurator] 应用静态 IP 异常: {ex.Message}\n{ex.StackTrace}");
return false;
}
}
///
/// 获取当前连接的 WiFi 配置
///
private static AndroidJavaObject GetCurrentWifiConfiguration()
{
try
{
// 获取连接信息
AndroidJavaObject connectionInfo = _wifiManager.Call("getConnectionInfo");
if (connectionInfo == null)
{
Debug.LogWarning("[AndroidNetworkConfigurator] 未连接到任何 WiFi");
return null;
}
int networkId = connectionInfo.Call("getNetworkId");
Debug.Log($"[AndroidNetworkConfigurator] 当前 NetworkId: {networkId}");
// 获取已配置的网络列表
AndroidJavaObject configList = _wifiManager.Call("getConfiguredNetworks");
if (configList == null)
{
Debug.LogError("[AndroidNetworkConfigurator] 无法获取配置列表");
return null;
}
// 遍历找到当前连接的配置
AndroidJavaClass listClass = new AndroidJavaClass("java.util.List");
int size = configList.Call("size");
for (int i = 0; i < size; i++)
{
AndroidJavaObject config = configList.Call("get", i);
int cfgNetworkId = config.Get("networkId");
if (cfgNetworkId == networkId)
{
return config;
}
}
// 如果没找到,创建新的配置
Debug.LogWarning("[AndroidNetworkConfigurator] 未找到现有配置,创建新配置");
AndroidJavaObject newConfig = new AndroidJavaObject("android.net.wifi.WifiConfiguration");
newConfig.Set("networkId", networkId);
return newConfig;
}
catch (Exception ex)
{
Debug.LogError($"[AndroidNetworkConfigurator] 获取 WiFi 配置异常: {ex.Message}");
return null;
}
}
///
/// 创建 StaticIpConfiguration 对象
///
private static AndroidJavaObject CreateStaticIpConfiguration(string ipAddress, string netmask, string gateway, string dns1, string dns2)
{
try
{
AndroidJavaObject staticIpConfig = new AndroidJavaObject("android.net.StaticIpConfiguration");
// 设置 IP 地址
AndroidJavaObject ipAddr = CreateInetAddress(ipAddress);
int prefixLength = MaskToPrefixLength(netmask);
AndroidJavaObject linkAddress = new AndroidJavaObject("android.net.LinkAddress", ipAddr, prefixLength);
staticIpConfig.Call("addIpAddress", linkAddress);
// 设置网关
if (!string.IsNullOrWhiteSpace(gateway))
{
AndroidJavaObject gatewayAddr = CreateInetAddress(gateway);
staticIpConfig.Set("gateway", gatewayAddr);
}
// 添加 DNS 服务器
AndroidJavaClass inetAddressClass = new AndroidJavaClass("java.net.InetAddress");
AndroidJavaObject dnsCollection = staticIpConfig.Get("dnsServers");
if (!string.IsNullOrWhiteSpace(dns1))
{
AndroidJavaObject dns1Addr = CreateInetAddress(dns1);
dnsCollection.Call("add", dns1Addr);
Debug.Log($"[AndroidNetworkConfigurator] 添加 DNS1: {dns1}");
}
if (!string.IsNullOrWhiteSpace(dns2))
{
AndroidJavaObject dns2Addr = CreateInetAddress(dns2);
dnsCollection.Call("add", dns2Addr);
Debug.Log($"[AndroidNetworkConfigurator] 添加 DNS2: {dns2}");
}
return staticIpConfig;
}
catch (Exception ex)
{
Debug.LogError($"[AndroidNetworkConfigurator] 创建 StaticIpConfiguration 异常: {ex.Message}");
return null;
}
}
///
/// 根据 IP 地址字符串创建 InetAddress 对象
///
private static AndroidJavaObject CreateInetAddress(string ipAddress)
{
try
{
AndroidJavaClass inetAddressClass = new AndroidJavaClass("java.net.InetAddress");
return inetAddressClass.CallStatic("getByName", ipAddress);
}
catch (Exception ex)
{
Debug.LogError($"[AndroidNetworkConfigurator] 创建 InetAddress '{ipAddress}' 异常: {ex.Message}");
return null;
}
}
///
/// 将子网掩码转换为前缀长度(CIDR)
///
private static int MaskToPrefixLength(string netmask)
{
try
{
string[] parts = netmask.Split('.');
if (parts.Length != 4)
{
Debug.LogWarning($"[AndroidNetworkConfigurator] 无效的子网掩码: {netmask}");
return 24; // 默认 /24
}
int maskValue = 0;
for (int i = 0; i < 4; i++)
{
if (int.TryParse(parts[i], out int octet))
{
maskValue = (maskValue << 8) | octet;
}
}
// 计算前缀长度
int prefixLength = 0;
uint mask = 0x80000000;
for (int i = 0; i < 32; i++)
{
if ((maskValue & mask) == mask)
{
prefixLength++;
mask >>= 1;
}
else
{
break;
}
}
Debug.Log($"[AndroidNetworkConfigurator] 子网掩码 {netmask} → 前缀长度 {prefixLength}");
return prefixLength;
}
catch (Exception ex)
{
Debug.LogError($"[AndroidNetworkConfigurator] 转换掩码异常: {ex.Message}");
return 24;
}
}
///
/// 获取当前 IP 配置信息
///
public static Dictionary GetCurrentIPConfiguration()
{
var config = new Dictionary();
try
{
Initialize();
if (_wifiManager == null)
{
config["status"] = "error";
config["message"] = "WifiManager 为空";
return config;
}
AndroidJavaObject connectionInfo = _wifiManager.Call("getConnectionInfo");
AndroidJavaObject dhcpInfo = _wifiManager.Call("getDhcpInfo");
if (connectionInfo != null)
{
int ipInt = connectionInfo.Call("getIpAddress");
string ip = FormatIPAddress(ipInt);
config["current_ip"] = ip;
string ssid = connectionInfo.Call("getSSID");
config["ssid"] = ssid ?? "未知";
}
if (dhcpInfo != null)
{
int ipInt = dhcpInfo.Get("ipAddress");
string ip = FormatIPAddress(ipInt);
config["dhcp_ip"] = ip;
int maskInt = dhcpInfo.Get("netmask");
string mask = FormatIPAddress(maskInt);
config["dhcp_mask"] = mask;
int gatewayInt = dhcpInfo.Get("gateway");
string gateway = FormatIPAddress(gatewayInt);
config["dhcp_gateway"] = gateway;
int dns1Int = dhcpInfo.Get("dns1");
string dns1 = FormatIPAddress(dns1Int);
config["dhcp_dns1"] = dns1;
int dns2Int = dhcpInfo.Get("dns2");
string dns2 = FormatIPAddress(dns2Int);
config["dhcp_dns2"] = dns2;
}
config["status"] = "success";
return config;
}
catch (Exception ex)
{
config["status"] = "error";
config["message"] = ex.Message;
Debug.LogError($"[AndroidNetworkConfigurator] 获取 IP 配置异常: {ex.Message}");
return config;
}
}
///
/// 格式化整数 IP 地址为点分十进制
///
private static string FormatIPAddress(int ipInt)
{
return $"{(ipInt & 0xff)}.{((ipInt >> 8) & 0xff)}.{((ipInt >> 16) & 0xff)}.{((ipInt >> 24) & 0xff)}";
}
}
#endif