我的应用程序中的一个功能是通过互联网发送数据。在尝试发送数据之前,我检查是否存在连接:
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
的{{1}}行getState
。
显然,TYPE_MOBILE
在没有3G的设备(仅限WiFi的平板电脑)上返回connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
。虽然我在Nexus 7模拟器上进行了测试,但我没有收到此错误。
因此,我感兴趣的是创建一个明确没有3G的AVD(即仅用于WiFi设备的AVD),以便我可以调查/测试这样的场景。我没有在模拟器选项中找到任何东西,但也许我只是在错误的地方寻找。这甚至可能吗?
答案 0 :(得分:3)
您应该能够更改AVD的硬件设置以删除调制解调器。该选项标记为hw.gsmModem
,但我相信它会禁用所有“单元数据”连接,而不仅仅是GSM。
如果要在不使用AVD Manager的情况下更改硬件选项,请编辑avd文件夹中的config.ini
文件。默认情况下,该文件夹位于:
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来测试它。我不知道这是否会模拟你正在寻找的空值,但它值得一试。
有关更多快捷方式,请参阅here。
答案 1 :(得分: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
值。