【发布时间】:2013-04-02 05:14:44
【问题描述】:
我想设置一个测试,看看我的代码在没有互联网访问时是否正常工作。有没有办法暂时关闭互联网访问以进行测试?
我试着环顾四周,但找不到。
【问题讨论】:
-
你想在代码中做吗?或者只是在您的设备上手动禁用它?
-
在理想情况下,我希望能够将其合并到 JUnit 测试中。
我想设置一个测试,看看我的代码在没有互联网访问时是否正常工作。有没有办法暂时关闭互联网访问以进行测试?
我试着环顾四周,但找不到。
【问题讨论】:
此代码示例应该适用于运行姜饼及更高版本的 Android 手机:此启用/禁用数据连接
private void setMobileDataEnabled(Context context, boolean enabled) {
final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
final Class conmanClass = Class.forName(conman.getClass().getName());
final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
iConnectivityManagerField.setAccessible(true);
final Object iConnectivityManager = iConnectivityManagerField.get(conman);
final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
setMobileDataEnabledMethod.setAccessible(true);
setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled);
}
不要忘记将此行添加到清单文件中
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
另外, 我知道启用或禁用 wifi:
WifiManager wifiManager = (WifiManager)this.context.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(status);
根据要求,状态可能为真或假。
也在清单中:
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
【讨论】:
java.lang.NoSuchMethodException: setMobileDataEnabled [boolean]。设备:Nexus 5x,Android 版本:7.1.1
好吧,要禁用 Wifi,您可以使用以下代码:
WifiManager wifiManager = (WifiManager)this.context.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(true); // "true" TO ENABLE || "false" TO DISABLE
要禁用数据连接,您可以使用此处的解决方案:https://stackoverflow.com/a/4304110/450534。但是,此方法不在 2.3+
上工作这里的答案有一个适用于 2.3+ 和 2.2 及以下版本的解决方案:https://stackoverflow.com/a/12535246/450534。您可以进行简单的 API 检查并决定运行哪段代码。这样的事情应该可以帮助您进行设置:
int currentAPIVersion = android.os.Build.VERSION.SDK_INT;
if (currentAPIVersion >= android.os.Build.VERSION_CODES.GINGERBREAD) {
// RUN THE CODE FOR 2.3+
} else {
// RUN THE CODE FOR API LEVEL BELOW 2.3
}
看看这两种方法中哪一种适合你。我怀疑,会是后者。不过,我个人从来没有测试过启用或禁用数据连接。
对链接解决方案的作者的支持。 ;-)
注意: 数据连接解决方案基于非官方 API,可能无法在未来的版本中使用。
【讨论】:
如果您使用的是模拟器,您可以在DDMS 设置中为其关闭互联网访问。
签出:
【讨论】: