我正在开发一个在手机上运行的应用程序,手机将是私人Wi网络上的一个站点。该电话将是一个站,而不是一个接入点,和私人will网络不路由到互联网。我的应用程序需要与互联网上的服务器以及本地with网络上的设备进行通信,因此它需要同时在两个网络上连接。我一直在想怎么做。
我一直在尝试谷歌Android开发者小组“Android2.x能否同时连接3G和Wifi数据网络”中描述的技术,但效果并不好。我发现,当我通过调用ConnectivityManager.setNetworkPreference(ConnectivityManager.TYPE_MOBILE)
启用蜂窝网络时,我在Wi网络上打开的任何套接字都是关闭的。我还没有试过,但我怀疑当我切换回Wi时,蜂窝网络上的套接字也会发生同样的情况。
另一个问题是,这些呼叫在全球范围内运行,改变整个电话的网络设置,而不仅仅是应用程序。像这样在全球范围内设置的网络切换会干扰正在手机上运行的任何其他应用程序。即使在我的应用程序退出后,手机仍继续以它设置的最后一个网络配置运行。
我正在寻找一种同时在移动数据和Wi网络上打开连接的方法,同时又不干扰在电话上运行的其他应用程序。
发布于 2013-04-28 07:59:06
这个线程Android: Force data to be sent over radio vs WiFi提到了解决这个问题的两种可能的方法。
当您希望应用程序使用特定连接时,
(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);cm.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);
connectivityManager.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE,"enableHIPRI");
对于第二种方法,具体说明它适用于Android2.2,不知道这在实际版本中是否有效。然而,据我所知,enableHIPRI
或多或少是一个隐藏的网络设置,所以如果可能的话,我更喜欢第一种方法。
发布于 2021-04-13 19:13:17
这其实很简单。您需要提交两个请求;一个用于具有cellular
传输类型的网络,另一个用于wifi
传输类型。然后,对于从这些请求返回的任何网络,您可以根据需要使用它们(例如,只使用从wifi
请求返回的网络来处理内部资源)。
下面是一个同时保持Wi和蜂窝并举的例子:
final ConnectivityManager connectivityManager = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkRequest requestForWifi =
new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.build();
final NetworkRequest requestForCellular =
new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.build();
final NetworkCallback cbWifi = new NetworkCallback() {
@Override
void onAvailable(Network network) {
// Triggers when this network is available so you can bind to it.
// Examples of how to bind to it include
// (uncomment the best option for your use-case):
// If you want to set connections for the entire app
// connectivityManager.bindProcessToNetwork(network);
// If you want to open a specific connection:
// By socket:
// try (Socket socket = new Socket()) {
// Network network = getNetwork();
// network.bindSocket(socket);
// }
// Or by URL:
// URLConnection conn = network.openConnection(URL url);
}
};
final NetworkCallback cbCellular = new NetworkCallback() {
@Override
void onAvailable(Network network) {
// Triggers when this network is available so you can bind to it.
}
};
connectivityManager.requestNetwork(requestForWifi, cbWifi);
connectivityManager.requestNetwork(requestForCellular, cbCellular);
只要有对特定网络类型(即Wi或蜂窝)的请求,ConnectivityService
( ConnectivityManager
所依赖的服务)将在可用的情况下保持这些网络正常运行。因此,使用上述模式,但调整NetworkRequest
对象以满足您的需要,您可以保持任何数量的网络。
发布于 2012-01-03 21:13:16
如果您不能使用API调用,如果您愿意让您的手与较低级别,一些linux知识可能会有所帮助。基本上,您要做的是打开两个接口,并在3g接口上设置默认路由。对于这类任务,您必须使用具有根权限的系统命令。关闭套接字的原因可能是接口由于API调用而不断下降和上升。
https://stackoverflow.com/questions/8718434
复制相似问题