为Android 3.x和4.x上的Wifi网络分配静态IP地址

为Android 3.x和4.x上的Wifi网络分配静态IP地址,android,android-wifi,android-networking,ipv4,Android,Android Wifi,Android Networking,Ipv4,我在一个项目上工作,如果用户需要,应该有一个为Wifi设置静态IP地址(DNS、网络掩码、网关)的功能 我的初始和实际解决方案使用了android.provider.Settings.System类,该类允许此功能,但此解决方案仅适用于android 2.x设备 这很好,当然我并没有完全处于零状态,但如果能让它在更高版本的Android操作系统上也能正常工作,那就太好了。它不知道为什么它不起作用 如果我使用此简单方法检查实际状态: public static final boolean hasS

我在一个项目上工作,如果用户需要,应该有一个为
Wifi
设置静态IP地址(DNS、网络掩码、网关)的功能

我的初始和实际解决方案使用了
android.provider.Settings.System
类,该类允许此功能,但此解决方案仅适用于android 2.x设备

这很好,当然我并没有完全处于零状态,但如果能让它在更高版本的Android操作系统上也能正常工作,那就太好了。它不知道为什么它不起作用

如果我使用此简单方法检查实际状态:

public static final boolean hasStaticIp(Context c) {
    try {
        return Settings.System.getInt(c.getContentResolver(), 
                                        Settings.System.WIFI_USE_STATIC_IP) == 1;
    }
    catch (SettingNotFoundException e) {
        Log.i(TAG, "Settings not found (" + e.geMessage() + ")");
        return false;
    }
}
对于Android 2.x和Android 4.x,它都返回true,但在第二种情况下,我发现的
Wifi
中肯定没有反映出变化,但它没有按预期工作

有没有人面临同样的问题

我很高兴有任何可行的解决方案,也很高兴有根设备(可能是linux中的一些命令),因为很容易检查手机是否有根

提前谢谢。

现在我可以说:“我抓到了”

我花了很多天寻找更好、更干净、100%工作的解决方案,看看反射解决方案的实际效果如何(现在我想目前只有一个)。但没有结果

因此,我再次尝试在此处使用上述解决方案:

令人惊讶的是,它确实有效!现在我知道我错过了什么。因此,在API大于10的设备上尝试此解决方案的每个人(sice蜂巢)都要确保您调用了:

wifiManager.saveConfiguration();
光打电话是不够的

wifiManager.updateNetwork(wifiConfiguration);
因为更改(也通过反射进行)不会永久保存到特定的WifiConfiguration

因此,现在它可以按预期工作,现在有一个小总结:

为Android 1.x和2.x设置静态IP地址: Android 1.x和2.x不提供每个SSID设置静态ip地址的解决方案(仅适用于实际连接的网络),因此简单的工作解决方案是使用ContentResolver并通过以下方式将数据写入系统设置

Settings.System.putInt(resolver, "wifi_use_static_ip", 1); // enabling static ip
Settings.System.putInt(resolver, "wifi_use_static_ip", 0); // enabling DHCP
为Android 3.x和4.x设置静态IP地址: 由于安卓3.x可以为每个SSID设置静态ip地址,因此针对低版本安卓操作系统的解决方案将无法工作

目前没有用于此目的的
API
,因此上面链接了反射的解决方案是唯一实际可行的解决方案

笔记: 不要忘记更改Android 3.x的
setGateway()

最后,如果有人想让应用程序为Android 3.x和4.x设置静态ip地址,那么合适的方法是将网络掩码前缀设置为int,而不完整的网络掩码前缀设置为int


希望能有所帮助。

Android L(5.0)预览版对我来说似乎有问题(我只是读取这些值来确定是静态还是DHCP,而不是更改)。如果有人找到Android L解决方案-请共享。
wifiManager.saveConfiguration()是一个很好的提示