在安卓系统中如何暂时禁用互联网访问?

8

我想建立一个测试,以查看当没有互联网访问时,我的代码是否正常工作。有没有一种方法可以暂时关闭互联网访问以进行测试?

我尝试寻找,但未能找到。


你想在代码中完成它吗?还是手动在设备上禁用它? - Siddharth Lele
在代码中,我希望能够将其整合到 JUnit 测试中。 - Classtronaut
3个回答

6

这段代码示例适用于运行Gingerbread及以上版本的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);

状态根据需求可能为true或false。

同时在清单文件中:

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

它对我不起作用。我收到了这个错误 java.lang.NoSuchMethodException: setMobileDataEnabled [boolean]。设备:Nexus 5x,Android 版本:7.1.1。 - David Novák

2

嗯,要禁用Wifi,您可以使用以下代码:

WifiManager wifiManager = (WifiManager)this.context.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(true); // "true" TO ENABLE || "false" TO DISABLE

要禁用数据连接,您可以使用此处的解决方案:https://dev59.com/onA65IYBdhLWcg3wxBmr#4304110。然而,这种方法在2.3+上不起作用
这个答案提供了2.3+和2.2及以下版本的解决方案:https://dev59.com/S2cs5IYBdhLWcg3w1ndq#12535246。您可以进行简单的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,可能在未来的版本中无法使用。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接