7

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 中的一些命令),因为很容易检查手机是否有根的状态。

提前致谢。

4

1 回答 1

10

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

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

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

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

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

从 Android 3.x 开始,可以为每个 SSID 设置静态 IP 地址,因此低版本 Android 操作系统的解决方案将不起作用。

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

笔记:

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

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

希望能帮助到你。

于 2013-08-16T08:40:26.083 回答