2

我的应用程序中的一项功能通过互联网发送数据。在尝试发送数据之前,我检查是否存在连接:

private boolean isConnected() {
    ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo.State val1 = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();
    NetworkInfo.State val2 = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
    return NetworkInfo.State.CONNECTED.equals(val1) || NetworkInfo.State.CONNECTED.equals(val2);
}

这在模拟器和我测试过的几个真实设备上运行得非常好。然后我收到了客户的错误报告,经调查发现是NullPointerException在线getStateTYPE_MOBILE.

显然,在没有 3G 的设备(仅限 WiFi 的平板电脑)上connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)返回。null虽然我在 Nexus 7 模拟器上进行了测试,但我没有收到此错误。

因此,我感兴趣的是创建一个明确没有 3G 的 AVD(即仅用于 WiFi 设备的 AVD),以便我可以调查/测试此类场景。我在模拟器选项中没有找到任何东西,但也许我只是在找错地方。这甚至可能吗?

4

2 回答 2

3

您应该能够更改 AVD 的硬件设置以移除调制解调器。该选项标记为hw.gsmModem,但我相信它会禁用所有“手机数据”连接,而不仅仅是 GSM。

如果您想在不使用 AVD 管理器的情况下更改硬件选项,请编辑config.iniavd 文件夹中的文件。默认情况下,该文件夹位于:

  • Linux/Mac: ~/.android/avd/yourAvdName

  • Windows Vista/7/(8?): C:\Users\.android\yourAvdName

  • Windows XP: C:\Documents and Settings\.android\yourAvdName

只需添加一行内容:

hw.gsmModem=no

有关更多详细信息,请参见此处此处


但是,您可以通过F8在模拟器中按下来关闭 3G 来测试它。我不知道这是否会模拟您正在寻找的空值,但值得一试。

有关更多快捷方式,请参见此处

于 2013-03-07T15:10:32.757 回答
1

我不相信有一个简单的解决方案。同时,我采用了如下代码:

private boolean isConnected(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo info1 = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    NetworkInfo info2 = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    NetworkInfo.State val1 = (info1 == null ? null : info1.getState());
    NetworkInfo.State val2 = (info2 == null ? null : info2.getState());
    return (info1 != null && NetworkInfo.State.CONNECTED.equals(val1)) || (info2 != null && NetworkInfo.State.CONNECTED.equals(val2));
}

null当接口不存在时,这会处理值。

于 2013-03-11T10:48:09.673 回答