我想我想要使用HIPRI连接:(例如:打开WiFi,使用HIPRI 3G): http://groups.google.com/group/android-developers/browse_thread/thread/d41f85505484d29b
我不相信你可以强制选择连接路径而不是临时明确地关闭Wi-Fi无线电(不推荐)。但是,在您希望发生这种情况的期间,您可以尝试设置网络优先级:
ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
//Prefer mobile over wifi
cm.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);
//Do your work
//Remove your preference
cm.setNetworkPreference(ConnectivityManager.DEFAULT_NETWORK_PREFERENCE);
希望能对你有所帮助!
ConnectivityManager.setNetworkPreference()即将过时。但更重要的是,如果在更改之前调用getNetworkPreference(),它将返回ConnectivityManager.TYPE_MOBILE。在那里设置不会有任何区别。至于HIPRI本身,它以相当奇怪的模式工作。首先,它允许连接到所有主机,而不仅仅是明确请求的主机。其次,当您使用stopUsingFeature...()调用关闭它时,它不会关闭并且仍然处于活动状态。第三,即使wifi可用,所有设备应用程序都开始使用它,这与文档中所说的相矛盾。
试着看看这个,它有很多信息,可能有你正在寻找的解决方案:如何在Android应用程序中使用3G连接而不是Wi-Fi?
它有一个工作服务示例,可以设置HIPRI移动连接并保持其运行。据我所知,这是在Android中拥有工作wifi和3g的唯一比较直接的方法。唯一的缺点是,此连接仅允许向明确请求路由的服务器传输数据。这基本上意味着您无法路由到许多服务器,因为按名称查找主机以获取IP地址需要时间,并且对于10个服务器进行此操作将需要30-60秒,这使其启动缓慢。因此,您应该确切地知道哪些服务器可以通过移动连接访问。
(我在这里回答过同样的问题here)
你不能针对每个应用程序显式地强制通信频道(你可以通过 ConnectivityManager.setNetworkPreference(...)
请求使用首选模式,但那不是“强制”的意思)。
虽然这可能会造成糟糕的用户体验,但你可以告知用户你的应用禁止使用WiFi,然后禁用他们的WiFi以继续使用。为此,你需要ACCESS_WIFI_STATE
和CHANGE_WIFI_STATE
权限。代码大致如下:
manager = (WifiManager)this.getSystemService(Context.WIFI_SERVICE);
if(manager.isWifiEnabled()) {
manager.setWifiEnabled(false);
}
// and to be sure:
ConnectivityManager.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);