【问题标题】:How to simulate total network loss in Android Emulator如何在 Android Emulator 中模拟总网络丢失
【发布时间】:2010-11-11 13:21:45
【问题描述】:

我正在尝试编写一个需要知道何时没有可用的 IP 网络连接的应用程序。我正在使用 android.net.conn.CONNECTIVITY_CHANGE 广播事件和 ConnectivityManager 对状态变化做出反应以实现此目的,但我在模拟器中测试我的设置时遇到问题。

我已经尝试过飞行模式和按 F8 来禁用“蜂窝网络”,但即使这两种方式都启用,应用程序仍然“看到”底层网络。

有没有人设法找到一种方法来模拟完全没有网络访问?

【问题讨论】:

  • @Hardlib:你能试试我发布的新答案吗?
  • 我想我已经解决了我在这里看到的问题。我有一个 3rd 方库,它执行一些网络工作,即使在示例代码表明网络已关闭之后,它仍可以在模拟器中继续工作。可以断开第 3 方连接,所以当 ConnectivityManager 说没有网络时,我会这样做。

标签: android android-emulator


【解决方案1】:

我体验过按下 F8 后状态栏中的图标显示没有连接,但如果您尝试浏览它就可以了。也许它与这个打开的错误有关:bug 3838

【讨论】:

  • 如果您的计算机是无线的,可以将 Windows 8 置于飞行模式,这是一种体面的“现实生活”测试方式,因为模拟器不知道发生了什么。
【解决方案2】:

Eclipse 中有 DDMS Perspective,您可以在其中操纵连接速度和可用性(在 Emulator Control 选项卡中)。如果它不适合你,我可能会建议打开你的操作系统的网络,甚至拔掉电缆:)

【讨论】:

    【解决方案3】:

    糟糕,我打算在此处发布此回复 (http://stackoverflow.com/questions/3400109/simulate-wireless-network-in-emulator/6078544#6078544)。

    这是我想出的在模拟器上模拟总网络连接丢失的解决方案:

    编写以下脚本并将其命名为“nonetwork.sh”

    netcfg eth0 down
    sleep 10
    netcfg eth0 up
    netcfg eth0 dhcp
    

    通过此命令将以下脚本上传到模拟器:

    adb push nonetwork.sh /data/local/nonetwork.sh
    

    更改权限

    adb shell chmod 700 /data/local/nonetwork.sh
    

    运行它

    adb shell /data/local/nonetwork.sh
    

    当设备上的网络出现故障时,您也将无法访问 adb,但一旦重新建立连接,它将再次工作。希望这会有所帮助。

    【讨论】:

    • 很棒的提示,tnx!唯一的小提示:此提示的用户必须保留脚本位置。 /mnt 下的脚本有“被宠坏的所有者”。
    【解决方案4】:

    isAvailable - 没有这个isConnected可以在WIFI被禁用时返回TRUE。有关更多信息,请参阅下面的代码和此 url http://developer.android.com/guide/developing/tools/emulator.html

        ConnectivityManager conMgr = ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    
          if (
    connMgr.getActiveNetworkInfo() != null &&
                conMgr.getActiveNetworkInfo().isAvailable() &&
    
        conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED || conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTING ) {
    
              //notify user you are online
    
          }       else if (
    
        conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.DISCONNECTED || conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED) { //notify user you are not online
    
              Toast.makeText(getBaseContext(),"Please
    
        Check Your Internet Connection and Try Again",Toast.LENGTH_SHORT).show();
    
          }
    

    android.permission.ACCESS_NETWORK_STATE 权限请求添加到您的应用程序清单中:

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

    【讨论】:

    • 嗨,我有一些与此非常相似的代码,问题是它会触发一些我需要测试和调试的复杂代码。问题在于测试这些事件,这就是为什么我要模拟将激活代码的触发器。
    • @hardlib:你能详细说明一下吗,我明白你的信息了吗?
    【解决方案5】:

    我更喜欢svc 命令

    svc wifi disable
    svc wifi enable
    

    通过netcfg 命令

    netcfg mlan0 up/down
    

    因为当你使用后者关闭wifi时,它会在一段时间后恢复,我还没有找到原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多