8

インターネットにアクセスできないときにコードが正しく動作するかどうかを確認するテストをセットアップしたいと考えています。テストのためにインターネット アクセスを一時的にシャットダウンする方法はありますか?

辺りを見回してみたが見つからなかった。

4

3 に答える 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);

status は、要件に応じて true または false の場合があります。

マニフェストでも:

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
于 2013-04-02T05:28:24.073 に答える
2

Well, to disable Wifi, you can use this code:

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

To disable the Data connection, you could use the solution here: https://stackoverflow.com/a/4304110/450534. This method, however, does not work on 2.3+

This answer here has a solution for both 2.3+ and 2.2 and below: https://stackoverflow.com/a/12535246/450534. You could do a simple API check and decide which piece of code to run. Something like this should get you set up:

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
}

See which of the two works for you. I suspect, it would be the later. I have personally never gotten around to testing the enabling or disabling Data connectivity though.

Props to the authors of the linked solutions. ;-)

NOTE: The Data Connectivity solutions are based on unofficial API's and may not work in future releases.

于 2013-04-02T05:27:07.020 に答える
1

If you are using emulator, you can turn off internet access for it in DDMS settings.

Check out:

  1. How to disable Internet Connection in Android Emulator?
  2. How to disable/enable network, switch to Wifi in Android emulator? (Question about unit testing)
于 2013-04-02T05:26:58.273 に答える