Android: 强制将数据发送到蜂窝网络而不是WiFi

14

5个回答

10

我不相信你可以强制选择连接路径而不是临时明确地关闭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);

希望能对你有所帮助!


2
就我进行的测试而言,从ConnectivityService源代码可以看出,设置此首选项会导致系统尝试拆除连接的任何非首选网络,因此它正在执行我们期望发生的操作。http://codesearch.google.com/codesearch#uX1GffpyOZk/services/java/com/android/server/ConnectivityService.java - devunwired
这个例子有点旧了。更新后使用正确的常量来将首选项重置为默认值。 - devunwired
这个触发器连接到任何东西。是我尝试不够还是悲伤的事情?我需要使用TCP连接吗?因为系统会将答案发送到另一个套接字!我通过一个套接字发送请求,然后通过另一个套接字接收回复!似乎Android更改了显式绑定套接字的IP地址。讨厌所有那些讨厌UDP并将套接字绑定在0.0.0.0上的人。:-)谷歌,他们是糟糕的编码人员,而不是我!为什么你听他们而不是我?悲伤的时光。启示录。 - Brian Cannard
3
setNetworkPreference() 在API 21中已被弃用。请参考http://developer.android.com/reference/android/net/ConnectivityManager.html#setNetworkPreference(int)。 - Code_Yoga

4
在Android 2.2中,您可以同时使用高优先级移动数据和WiFi。 “feature”参数的值为“enableHIPRI”,并且在Phone API中隐藏。
方法: http://developer.android.com/reference/android/net/ConnectivityManager.html的ConnectivityManager.startUsingNetworkFeature(int networkType, String feature)。
来源:http://code.google.com/p/android/issues/detail?id=5885 您可以查看此答案:https://dev59.com/DXE85IYBdhLWcg3w_I38#4756630 这不是一个好的政策……只有在真正需要时才使用!

作为用户,您希望手机仅在WiFi断开连接时才使用移动数据。如果这个功能正常工作,您可能会在用户不知情或无法阻止的情况下增加移动数据费用。 - neteinstein
不,这是错误的——作为用户,我期望我的SIP实际工作,而WiFi不能保证它,所以我选择只使用3G选项。然而,根据http://android.stackexchange.com/questions/61554/is-there-a-way-for-3g-to-not-disconnect-when-connecting-to-wifi,当WiFi连接时,我现在没有任何SIP。这是应用程序中的一个错误吗,还是有些东西无法在应用程序内修复? - cnst
它不起作用。它来回切换,并且只允许那些在3G IP上打开和绑定的套接字继续在另一个Wi-Fi IP上工作。谷歌中那些疯狂的强盗认为破坏经典的伯克利套接字是很棒的。黑客们,看看你们能够破解什么!;-) - Brian Cannard

1

ConnectivityManager.setNetworkPreference()即将过时。但更重要的是,如果在更改之前调用getNetworkPreference(),它将返回ConnectivityManager.TYPE_MOBILE。在那里设置不会有任何区别。至于HIPRI本身,它以相当奇怪的模式工作。首先,它允许连接到所有主机,而不仅仅是明确请求的主机。其次,当您使用stopUsingFeature...()调用关闭它时,它不会关闭并且仍然处于活动状态。第三,即使wifi可用,所有设备应用程序都开始使用它,这与文档中所说的相矛盾。


0

试着看看这个,它有很多信息,可能有你正在寻找的解决方案:如何在Android应用程序中使用3G连接而不是Wi-Fi?

它有一个工作服务示例,可以设置HIPRI移动连接并保持其运行。据我所知,这是在Android中拥有工作wifi和3g的唯一比较直接的方法。唯一的缺点是,此连接仅允许向明确请求路由的服务器传输数据。这基本上意味着您无法路由到许多服务器,因为按名称查找主机以获取IP地址需要时间,并且对于10个服务器进行此操作将需要30-60秒,这使其启动缓慢。因此,您应该确切地知道哪些服务器可以通过移动连接访问。


请注意,仅链接回答不被鼓励,SO(Stack Overflow)的答案应该是寻找解决方案的终点(而不是参考资料的另一个中转站,往往会随着时间而过时)。请考虑在此处添加独立的摘要,并将链接保留为参考。 - kleopatra

0

(我在这里回答过同样的问题here

你不能针对每个应用程序显式地强制通信频道(你可以通过 ConnectivityManager.setNetworkPreference(...) 请求使用首选模式,但那不是“强制”的意思)。

虽然这可能会造成糟糕的用户体验,但你可以告知用户你的应用禁止使用WiFi,然后禁用他们的WiFi以继续使用。为此,你需要ACCESS_WIFI_STATECHANGE_WIFI_STATE权限。代码大致如下:

manager = (WifiManager)this.getSystemService(Context.WIFI_SERVICE);

if(manager.isWifiEnabled()) {
    manager.setWifiEnabled(false);
}
// and to be sure:
ConnectivityManager.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);

ConnectivityManager.setNetworkPreference()即将被淘汰。但更重要的是,如果在更改之前调用getNetworkPreference(),它将返回ConnectivityManager.TYPE_MOBILE。在那里进行设置不会有任何区别。 - Cynichniy Bandera

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