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

Sim*_*iak 7 android ipv4 android-networking android-wifi

我在一个项目上工作,应该有一个功能,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;
    }
}
Run Code Online (Sandbox Code Playgroud)

它对于Android 2.x和Android 4.x都返回true,但在第二种情况下,更改肯定没有反映在Wifi我发现这是一个小硬编码的解决方案,但它没有按预期工作.

是否有人面临同样的问题?

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

提前致谢.

Sim*_*iak 10

现在我可以说:"我抓住了它"

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

所以我再次尝试使用上面提到的反射解决方案:

而且令人惊讶的是它有效!现在我知道我错过了什么.因此,每个在设备上使用API超过10个(sice Honeycomb)尝试此解决方案的人都要确保打电话:

wifiManager.saveConfiguration();
Run Code Online (Sandbox Code Playgroud)

仅仅打电话是不够的

wifiManager.updateNetwork(wifiConfiguration);
Run Code Online (Sandbox Code Playgroud)

因为更改(也通过反射进行)不会永久保存到特定的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
Run Code Online (Sandbox Code Playgroud)

设置Android 3.x和4.x的静态IP地址:

由于Android 3.x可以为每个SSID设置静态IP地址,因此对于较低版本的Android OS的解决方案将无法正常工作.

目前没有API为此目的,因此上面链接的反射解决方案只是实际工作的解决方案.

笔记:

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

最后,因为如果有人想要为Android 3.x和4.x设置静态IP地址的应用程序,正确的方法将网络掩码前缀作为int不是完整的网络掩码,所以这里是可用网络掩码及其前缀的列表.

希望能帮助到你.

  • Android L(5.0)预览这似乎打破了我(我只是读取值来确定是静态还是DHCP,而不是改变).如果有人找到Android L解决方案 - 请分享. (2认同)