如何在Android模拟器中禁用/启用网络并切换到Wifi?

30
我正在为Android开发Push通知库(http://deaconproject.org/),如果网络连接中断或更改,需要采取措施 - 即需要重新初始化服务器连接或暂停操作,直到网络连接可用。使用Android BroadcastReceiver的 "android.net.ConnectivityManager.CONNECTIVITY_ACTION" 似乎可以正常工作。

我的问题在于测试库 - 我想自动测试库对各种配置条件下断网连接或从3G转换到WiFi的响应。但是,我不想整天坐在模拟器前按 F8。

有没有一种方法可以在jUnit测试中从Android内部以编程方式操纵网络连接,而不必切换飞行模式?我已经尝试通过控制台向模拟器发出命令、操纵GSM模式等,但是虽然手机状态在显示屏上更改了,但互联网连接仍然保持连接。


请参阅此问题,其中包含一个指向已记录在2009年的开放Android缺陷的链接。给那个问题投一些票吧! - James Koch
1
你最终找到解决这个问题的方法了吗? - pehrs
也想知道答案,有什么想法吗? - Hannes Niederhausen
请参考这个问题 - Jeff Axelrod
你们能否投票支持一下这个问题?https://code.google.com/p/android/issues/detail?id=36916 - kenyee
5个回答

7

在“项目资源管理器”面板中右键单击项目,选择“运行为”,然后选择“运行配置”。

在模态显示的窗口的左侧选择“Android应用程序”,在同一窗口的右侧选择“目标”选项卡。

在窗口底部的“模拟器启动参数”部分,您可以选择各种有关互联网连接的选项。

希望这可以帮助您。

Igor


8
谢谢您的答复 - 这是朝着正确方向迈出的一步。模拟器启动参数可以在启动时调整网络连接,但我们正在寻找一种在运行时以编程方式进行调整的方法。必须对Android广播意图(例如android.net.ConnectivityManager.CONNECTIVITY_ACTION)做出响应的“测试中”库,以便将其状态调整为设备的网络状态。我们需要一种从JUnit测试中更改网络状态的方法,以便验证意图是否得到适当的接收和处理... - mtbkrdave

6
我发现Android Dev Tools应用程序非常有用。
它允许您操作重要的系统设置,如网络连接。它甚至允许您设置一个时间间隔,自动切换wifi开关,从而允许您测试与网络相关的广播接收器。

如果您想在真实的开发设备上安装Dev Tools应用程序,可以从模拟器中复制该应用程序,然后使用ADB将其安装到设备上。要从正在运行的模拟器中复制应用程序,请执行:

adb -e pull /system/app/Development.apk ./Development.apk

这将把.apk文件复制到当前目录。然后,使用以下命令将其安装到您连接的设备上:
adb -d install Development.apk

enter image description here


4
这对于那些希望手动操纵网络状态的人很有帮助,但这里的问题是寻找一种以编程方式(即从单元测试中)实现此操作的方法。是否可以通过向 Dev Tools 应用程序发送意图来实现? - mtbkrdave

4

很遗憾,目前没有办法在单元测试中通过编程方式真正禁用网络访问。我已经针对这个问题提交了Android增强请求


4
您可能还想查看Eclipse中的模拟器控制视图。目前我没有很好地让它清除我的数据,但看起来它应该可以。

alt text


我已经尝试了通过控制台ADB连接的选项,但似乎并没有真正断开连接;尽管我关闭了GSM数据连接,网络流量仍然可以正常工作。我在这里寻找的是一种编程方式 - 在自动化测试(例如JUnit测试)的范围内实现它的方法。 - mtbkrdave
我也遇到了同样的问题(通信似乎仍在继续)。听起来你已经找到了一种通过ADB shell脚本化这个问题的方法(如果它再次开始工作或者我们偶然发现了正确的控制命令)。另外,我也能够通过telnet到模拟器并使用gsm数据关闭和gsm语音关闭命令(尽管同样的问题仍然存在),参考https://dev59.com/63E85IYBdhLWcg3w2Hbs#2578245。 - Chris
谢谢提示,将这些状态更改为“未注册”对我有用。不过,我对单元测试一无所知。 - Walf

0
一个简单但有点冗长和繁重的解决方案是,在您的 WiFi 连接状态监视器上添加一个抽象层。
添加一个实体(NetworkStateManager),它应该是一个应用程序作用域的单例(请参见 RoboGuice 或 Dagger 来进行清理,或通过应用程序实例访问唯一实例)。
使用 Observable Observer 设计模式向该实体添加方法,以注册、取消注册监听器。
每个活动将在 onStart 期间注册,停止时取消注册。
该实体本身将由 BroadCastReceiver 修改。
如果使用 DI 框架,则可以将可驱动的存根注入到您的活动中,并查看它们对网络状态更改的反应。

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