【问题标题】:Temporarily disabling internet access in android?暂时禁用android中的互联网访问?
【发布时间】:2013-04-02 05:14:44
【问题描述】:

我想设置一个测试,看看我的代码在没有互联网访问时是否正常工作。有没有办法暂时关闭互联网访问以进行测试?

我试着环顾四周,但找不到。

【问题讨论】:

  • 你想在代码中做吗?或者只是在您的设备上手动禁用它?
  • 在理想情况下,我希望能够将其合并到 JUnit 测试中。

标签: android testing


【解决方案1】:

此代码示例应该适用于运行姜饼及更高版本的 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
  • @DavidNovák:更多解释请参见此处:stackoverflow.com/questions/26539445/…
【解决方案2】:

好吧,要禁用 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,可能无法在未来的版本中使用。

【讨论】:

    【解决方案3】:

    如果您使用的是模拟器,您可以在DDMS 设置中为其关闭互联网访问。

    签出:

    1. How to disable Internet Connection in Android Emulator?
    2. How to disable/enable network, switch to Wifi in Android emulator?(关于单元测试的问题)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多