是否可以强制Android应用程序仅使用移动无线电连接(3g/4g/etc),而不允许使用WiFi?
我想我想使用 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);
希望对您有所帮助!
在Android 2.2中,您可以同时使用高优先级的移动数据与WiFi。"功能"参数的值为"启用HIPRI",隐藏在电话 API 中。
方法:ConnectivityManager.startUsingNetworkFeature(int networkType, String feature) ofhttp://developer.android.com/reference/android/net/ConnectivityManager.html
来源: http://code.google.com/p/android/issues/detail?id=5885
你可以检查另一个答案:https://stackoverflow.com/a/4756630/327011
这不是一个好政策...如果真的需要,请使用它!
ConnectivityManager.setNetworkPreference() 即将过时。但更重要的是,如果你在更改之前确实得到了 NetworkPreference(),它将返回ConnectivityManager.TYPE_MOBILE。将其设置在那里没有任何区别。至于HIPRI本身,它以非常奇怪的模式工作。首先,它允许连接到所有主机,而不仅仅是显式请求的主机。其次,当您使用停止使用功能将其关闭时...() 调用,它不会被关闭,仍将处于活动状态。第三,即使wifi可用,所有设备应用程序也开始使用它,这与文档中所说的相矛盾。
(我在这里回答了同样的问题)
您不能基于每个应用程序显式强制通信通道(您可以通过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);
尝试查看此内容,它有很多信息,并且可能有您正在寻找的解决方案: 如何在Android应用程序中使用3G连接而不是Wi-Fi?
它具有设置HIPRI移动连接并保持其运行的工作服务示例。AFAIK 这是在 android 中拥有工作 wifi 和 3G 的唯一或多或少直接的方法。唯一的缺点是,此连接仅允许将数据传输到显式请求路由的服务器。这基本上意味着您无法路由到许多服务器,因为按名称查找主机以获取 IP 地址需要时间,而对 10 台服务器执行此操作将需要 30-60 秒,这使得它启动缓慢。因此,您应该确切地知道哪些服务器应该通过移动连接可用。