【问题标题】:How to stay connected through mobile network after WIFI is connected on Android?安卓连接WIFI后如何通过移动网络保持连接?
【发布时间】:2015-07-02 08:02:12
【问题描述】:

我注意到,当通过 3G(移动)连接从远程服务器流式传输音频时,以及 WIFI 断开或关闭时,一旦 WIFI 被激活并连接,通过 3G 的连接就会断开。

我希望应用程序继续使用 3G,即使现在也连接了 WIFI。我想这样做以保持连续性。 (用户可以选择加入/退出此行为)。

是否有特殊的标志、锁等。为此目的?

【问题讨论】:

    标签: android android-wifi android-networking connectivity


    【解决方案1】:

    这在 Android 5.0 (Lollipop) 之前的设备上是不可能的。操作系统一次只保持一个接口,应用程序无法控制这个选择。

    在运行 Android 5.0 或更高版本的设备上,您可以使用新的多网络 API 来选择要用于网络流量的接口。

    以下是执行此操作的步骤,来自Android 5.0 changelog

    要从您的应用中动态选择并连接到网络,请按以下步骤操作:

    1. 创建ConnectivityManager
    2. 使用NetworkRequest.Builder 类创建NetworkRequest 对象并指定您的应用感兴趣的网络功能和传输类型。
    3. 要扫描合适的网络,请调用requestNetwork()registerNetworkCallback(),并传入NetworkRequest 对象和ConnectivityManager.NetworkCallback 的实现。如果您想在检测到合适的网络后主动切换到合适的网络,请使用requestNetwork() 方法;要仅接收扫描网络的通知而不主动切换,请改用registerNetworkCallback() 方法。

    当系统检测到合适的网络时,它会连接到网络并调用 onAvailable() 回调。您可以使用回调中的 Network 对象来获取有关网络的其他信息,或引导流量使用选定的网络。

    具体来说,如果您想通过 3G/LTE 强制您的流量,即使存在 WiFi 信号,您也可以使用如下方式:

    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(
                              Context.CONNECTIVITY_SERVICE);
    NetworkRequest.Builder req = new NetworkRequest.Builder();
    req.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
    cm.requestNetwork(req.build(), new ConnectivityManager.NetworkCallback() {
    
        @Override
        public void onAvailable(Network network) {
            // If you want to use a raw socket...
            network.bindSocket(...);
            // Or if you want a managed URL connection...
            URLConnection conn = network.openConnection(...);
        }
    
        // Be sure to override other options in NetworkCallback() too...
    
    }
    

    【讨论】:

    • 很好的信息!非常感谢!您对如何通过 NDK 侧锁定 3G 有想法吗? (在 c/c++ 端保持连接到 3G,因为我使用 NDK 连接到服务器)
    • 此 API 仅在 Android 的 Java 框架中可用,因此如果您想从 NDK 中访问它,您必须使用 JNI 从 C++ 调用 Java。
    • 嗨@TrevorJohns,如果我在“onAvailable”期间使用这种方法发送Http请求,它们会从指定的网络发送吗?例如,我为此使用 AsyncHttpClient。如果我在 onAvailable 中调用 client.Get(),该请求会通过指定的网络路由吗?
    • 完美的解决方案,现在已经完成了与蜂窝的绑定如果我想从蜂窝中解除绑定,可能的方式是什么。这对我来说很紧急。
    • 从请求的网络调用中解除绑定 connectionManager.unregisterNetworkCallback(callback);
    猜你喜欢
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 2015-12-24
    相关资源
    最近更新 更多