在 android 5+ 中将应用设置为使用蜂窝网络而不是 WiFi

Set app to use cellular network rather than WiFi in android 5+

我们正在制作一个应用程序,即使已连接 WiFi,也需要针对某些请求切换到蜂窝网络。 根据 ConnectionManager 文档,以下这些方法现已弃用,但不清楚应该使用什么。

  public void useMobileNetworkMode(Context context) {
    ConnectivityManager  cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    cm.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);
}

public void useDefaultNetworkMode(Context context) {
    ConnectivityManager  cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    cm.setNetworkPreference(ConnectivityManager.DEFAULT_NETWORK_PREFERENCE);

}

这些方法在 android 5/6 中仍然有效吗?如果有人有信息或其他方法可以替换这些方法,我将不胜感激!


好的,关于这个问题的更多信息:) 我已经设法调查 ConnectivityManager 并且可以使用 :

查看网络
                     Network networkToUse = null;
    Network[] networks;
    networks = cm.getAllNetworks();
    for (Network network : networks) {
        NetworkInfo ni = cm.getNetworkInfo(network);
        Log.e("NETWORKINFO", ni.getType() + "   " + ni.getExtraInfo());
        if (ni.getType()== ConnectivityManager.TYPE_WIFI) {
            Log.e("NETWORKINFO", "isWifi");
            if (ni.isConnected()) {
                Log.e("NETWORKINFO", "and is connected");
                if (networkToUse == null) {
                    networkToUse = network;
                }
            }
        }
        if (ni.getType()== ConnectivityManager.TYPE_MOBILE) {
            Log.e("NETWORKINFO", "HasMobile");
            if (ni.isConnected()) {
                Log.e("NETWORKINFO", "and is connected");
                networkToUse = network;
            }
        }
    }

在这里我有点卡住了,因为在从 URL.openLink();.[=20 执行 HttpsURLConnection 时,我无法从逻辑上看到告诉应用程序使用这些网络之一的方法=]


更新: 我刚刚注意到移动设备在 WiFi 连接后不久就消失了。有一段时间我两者都得到了,但时间不长。

我也试过这个:

    final ConnectivityManager connection_manager =
            (ConnectivityManager)httpsClient.getCheckoutController().getCheckout().getCurrentActivity().getApplication().getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkRequest.Builder request = new NetworkRequest.Builder();
    request.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);

    connection_manager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() {

        @Override
        public void onAvailable(Network network) {
            Log.e("NETWORKINFO", "FOUND A CELLULAR NETWORK " + connection_manager.getNetworkInfo(network));
        }
    });

    request = new NetworkRequest.Builder();
    request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
    connection_manager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() {


        @Override
        public void onAvailable(Network network) {
            Log.e("NETWORKINFO", "FOUND A WIFI NETWORK "+connection_manager.getNetworkInfo(network));
        }
    });

但与 "list" 网络一样,在之前的尝试中,即使移动数据也已打开,我也只回拨了 1 次。


更新; 好的,我似乎有时会看到移动设备使用上述方法。但它似乎创造了 API 级意大利面条地狱。有时移动回调也需要很长时间才能触发。我想知道这是不是因为它必须唤醒蜂窝调制解调器并等待它的握手之类的?


更新; 我有另一个可能的建议使用套接字(我对它没有什么经验..)

有谁知道是否可以使用 HttpsURLConnection.getSocketFactory()SSLSocket 构建一个 CELLULAR SSL 连接套接字来执行 https 请求?

在这个为期一周的任务中,任何信息都将非常受欢迎 :D


更新: 从 google 的某个人那里找到了一个很好而明确的答案:

但是在实施之后,我收到了移动设备的网络回调,但是当我打开 URL 连接并执行请求时,它似乎卡住了很长时间(大约 4 分钟)才得到响应。

我有一个华为 5.0.1 phone,这是我可用的最高版本。显然这样不好。然而它没有在 5.1 galaxy S6 上测试并且可以工作.. 所以可能是 phone。

根据 Android 文档,它不再适用于 Android 版本 5 及更高版本。

This method was deprecated in API level 21.

Functionality has been removed as it no longer makes sense, with many more >than two networks - we'd need an array to express preference. Instead we >use dynamic network properties of the networks to describe their >precedence.

在 google 找到了一个很好且明确的答案:Android 上连接 WIFI 后如何通过移动网络保持连接?

(Link 在上面的编辑信息中)

但是在实施之后,我收到了移动设备的网络回调,但是当我打开 URL 连接并执行请求时,它似乎卡住了很长时间(大约 4 分钟)才得到响应。

我有一个华为 5.0.1 phone,这是我可用的最高版本。显然这样不好。然而它没有在 5.1 galaxy S6 上测试并且可以工作.. 所以可能是 phone.