我可以在 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 或蜂窝网络)的请求,ConnectivityServiceConnectivityManager 所依赖的服务)就会在可用时保持这些网络正常运行。因此,使用上述模式但调整 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 和蜂窝网络接口吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 上检测飞行模式?

如何在 Android 上检测飞行模式?

如何查看 Android 上是不是连接了 Wi-Fi?

我可以在应用程序中使用 Wi-Fi Direct 和蜂窝数据吗?

光子。在 Android 上重启 WI-FI 后 OnRoomListUpdate 不起作用

Android Studio – 在 Mac OS 上通过 Wi-Fi 运行和调试构建 [重复]