【问题标题】:Can I have both Wi-Fi and cellular network interfaces open at the same time on Android?我可以在 Android 上同时打开 Wi-Fi 和蜂窝网络接口吗?
【发布时间】: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 网络同时进行,不干扰 手机上运行的其他应用程序。

  1. 有谁知道怎么做 这个?
  2. 有人知道这是否可行吗?

【问题讨论】:

标签: android android-wifi


【解决方案1】:

此线程Android: Force data to be sent over radio vs WiFi 提到了解决该问题的两种可能方法。

  1. 在您希望应用使用特定连接时设置网络首选项:

    ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    cm.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);
    
  2. 启用高优先级移动数据连接:

    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。当然,前提是两者同时开启。

                您可以考虑使用面向互联网的 VPN,而不是使用私人 Wi-Fi,从而限制您的选择,这样设备将从 3G/4G 连接到 VPN,然后在您担心使用安全性的情况下访问数据私人 Wi-Fi。

                并且 VPN 客户端内置在 Android 中,也有第三方客户端可用。

                【讨论】:

                  猜你喜欢
                  • 2012-04-12
                  • 2017-07-30
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-11-23
                  • 2011-07-07
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多