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

时间:2013-08-08 20:59:20

标签: android android-wifi android-networking ipv4

我正在开发一个项目,如果用户想要它,应该有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我找到this a little hardcoded solution但是它没有按预期工作。

有没有人面对同样的问题?

我会很高兴任何有效的解决方案以及root设备(可能是Linux中的一些命令),因为很容易检查手机是否有根据的状态。

提前致谢。

1 个答案:

答案 0 :(得分:10)

现在我可以说:“我抓住了它”

我花了很多天时间寻找更好,更清洁和100%工作的解决方案,实际(现在我认为目前只有一个解决方案)的解决方案是反射的。但没有结果。

所以我再次尝试在这里使用提到的解决方案:

令人惊讶的是它有效!现在我知道我错过了什么。因此,在API大于 10 (sice Honeycomb)的设备上尝试此解决方案的所有人都确保您致电:

wifiManager.saveConfiguration();

仅仅打电话

是不够的
wifiManager.updateNetwork(wifiConfiguration);

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

所以现在它按预期工作,现在有点总结:

为Android 1.x和2.x设置静态IP地址:

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

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地址:

由于Android 3.x可以为每个SSID设置静态IP地址,因此较低版本的Android操作系统的解决方案将无效。

目前没有API用于此目的,因此上面链接的反射解决方案只是实际有效的解决方案。

说明:

不要忘记为Android 3.x更改setGateway()(在原始帖子中也提到)

最后因为如果有人想申请为Android 3.x和4.x设置静态IP地址,那么正确的方法需要 netmask前缀为int 不是完整的网络掩码所以here is list of available netmasks带有前缀。

希望它有所帮助。