我可以在 Android 上同时打开 Wi-Fi 和蜂窝网络接口吗?
Posted
技术标签:
【中文标题】我可以在 Android 上同时打开 Wi-Fi 和蜂窝网络接口吗?【英文标题】:Can I have both Wi-Fi and cellular network interfaces open at the same time on Android? 【发布时间】:2012-02-01 20:33:41 【问题描述】:我正在开发一个将在手机上运行的应用程序 将是专用 Wi-Fi 网络上的一个站点。电话将是一个 站,而不是接入点,并且专用 Wi-Fi 网络不 到 Internet 的路由。我的应用程序需要与 Internet 上的服务器以及本地 Wi-Fi 网络上的设备, 所以它需要同时在两个网络上都有连接。 我一直在想办法做到这一点。
我一直在尝试讨论中描述的技术
谷歌 android 开发者小组名为“Can
Android 2.X 同时连接 3G 和 Wifi 数据网络?”,但是
它运行不正常。我发现,当我启用
通过呼叫蜂窝网络
ConnectivityManager.setNetworkPreference(ConnectivityManager.TYPE_MOBILE)
,
我在 Wi-Fi 网络上打开的所有套接字都已关闭。我没有
试过了,但我怀疑同样的事情会发生在插座上
当我切换回 Wi-Fi 时使用蜂窝网络。
另一个问题是, 这些调用在全球范围内运行,改变了网络设置 适用于整个手机,而不仅仅是应用程序。切换网络 像这样全局设置会干扰任何其他应用程序 恰好在手机上运行。即使在我的应用程序退出后, 手机继续使用它设置的最后网络配置运行。
我正在寻找一种方法在两个蜂窝网络上都打开连接 数据和 Wi-Fi 网络同时进行,不干扰 手机上运行的其他应用程序。
-
有谁知道怎么做
这个?
有人知道这是否可行吗?
【问题讨论】:
类似的问题? ***.com/questions/5497553/wifi-and-3g-same-time 【参考方案1】:此线程Android: Force data to be sent over radio vs WiFi 提到了解决该问题的两种可能方法。
在您希望应用使用特定连接时设置网络首选项:
ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
cm.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);
启用高优先级移动数据连接:
connectivityManager.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, "enableHIPRI");
对于第二种方法,它特别声明它适用于 Android 2.2,不知道这是否也适用于实际版本。但是据我所知,enableHIPRI
或多或少是一个隐藏的网络设置,所以如果可能的话,我更喜欢第一种方法。
【讨论】:
【参考方案2】:这其实很简单。您需要提交两个请求;一个用于具有cellular
传输类型的网络和一个具有wifi
传输类型的附加请求。然后,对于从这些请求返回的任何网络,您都可以根据需要使用它们(例如,仅使用从 wifi
请求返回的网络处理内部资源)。
以下是同时保持 Wi-Fi 和蜂窝网络正常运行的示例:
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.
;
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-Fi 或蜂窝网络)的请求,ConnectivityService
(ConnectivityManager
所依赖的服务)就会在可用时保持这些网络正常运行。因此,使用上述模式但调整 NetworkRequest
对象以满足您的需求,您可以保持任意数量的网络正常运行。
【讨论】:
【参考方案3】:如果您不能使用 API 调用来实现它,并且如果您愿意接触较低级别的东西,那么一些 linux 知识可能会有所帮助。 基本上你要做的是调出两个接口并在 3g 接口上设置默认路由。 对于此类任务,您必须使用具有 root 权限的系统命令。 关闭套接字的原因很可能是接口因为API调用而上下波动。
【讨论】:
【参考方案4】:如果没有 root 访问权限,应用程序不会产生太大影响。
使用Android API,您最多只能打开WiFi,希望设备切换到它并关闭WiFi以使设备切换到3G(如果有,APN是正确的等等)。
不保证其他任何东西都能正常工作。例如。设置首选连接类型并不能保证设备会切换到该类型。
通常的行为是,一旦 WiFi 可用,设备将同时打开 3G 和 WiFi 一段时间(3-5 秒),然后关闭 3G。一旦用户或您的应用程序关闭 WiFi,并且设备尝试连接到 Internet,它将在片刻后打开 3G。
从 Android 2.3 开始,您不能再对 3G 进行事件禁用/启用。一种用于破坏/恢复 APN 设置以启用/禁用 3G,但从 4.0 开始,您无法以编程方式更改 APN 设置。
【讨论】:
不完全 - 仍然可以手动禁用 3G。只需打开拨号器并输入*#*#4636#*#*
。然后点按“电话信息”和“关闭收音机”。【参考方案5】:
我认为一次只能提供一项服务。您可以使用 WiFi,也可以使用蜂窝 3G 数据。两者不能同时工作。
【讨论】:
【参考方案6】:3G 和 Wifi 数据网络不能同时连接,但如果运营商支持并且 android 框架也因运营商而改变,3G 和 Wifi 可以同时连接。 现在有些运营商已经有了这个功能,有些还没有。
【讨论】:
【参考方案7】:目前在 Android 应用程序中无法同时使用两个网络,但您可以在 PC 中执行此操作。 从您的 WIFI 路由器连接一个,从 LAN 或 USB 互联网棒连接一个。 所以创建APP并在PC上使用。如果你不知道如何在 PC 上运行 Android,那就去谷歌吧。
【讨论】:
【参考方案8】:您可能想研究 ad-hoc wifi 网络。 即使机器人已经在使用 wifi 上网,它也可以通过 wifi 连接到设备(但不使用 ip 堆栈)。
不要将 wifi (IEEE 802.11x) 连接与互联网 (IP) 连接混淆。 IP 可以在 wifi、移动、以太网、DSL、dailup 或信鸽上运行,但一次只能在一个网络上运行。
有关 ad-hoc wifi 网络的更多信息,请查看以下链接。
https://code.google.com/p/android-wifi-tether/
请注意,许多运营商禁止多播(共享)其 IP 连接。不错。
【讨论】:
【参考方案9】:如果我没记错的话,如果 Wi-Fi 和 3G/4G 都可用,那么 Wi-Fi 会优先。
只有当 Wi-Fi 不可用时,才会切换到 3G/4G。当然,前提是两者同时开启。
您可以考虑使用面向互联网的 ***,而不是使用私人 Wi-Fi,从而限制您的选择,这样设备将从 3G/4G 连接到 ***,然后在您担心使用安全性的情况下访问数据私人 Wi-Fi。
并且 *** 客户端内置在 Android 中,也有第三方客户端可用。
【讨论】:
以上是关于我可以在 Android 上同时打开 Wi-Fi 和蜂窝网络接口吗?的主要内容,如果未能解决你的问题,请参考以下文章
我可以在应用程序中使用 Wi-Fi Direct 和蜂窝数据吗?