【问题标题】:How, when wifi and mobile networks are enabled, do you choose to transfer data through the mobile network on android?如何,在开启wifi和移动网络的情况下,在android上是选择通过移动网络传输数据吗?
【发布时间】:2020-09-09 09:18:29
【问题描述】:

实际上一切都有效,只有一个例外。如果我们首先通过移动数据分配传输,那么一切正常,数据通过移动网络。然后我选择wifi数据,一切也都很好。但是如果之后再次选择移动数据,那么传输已经通过wifi了,为什么会这样?为什么第一次启动一切正常,再次打开wifi时,数据通过wifi,而不是通过移动通信?谁知道原因?先感谢您。代码如下。

public void setTransportType(int transportType) {

    connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

    if (networkCallback != null) {
        connectivityManager.unregisterNetworkCallback(networkCallback);
        networkCallback = null;
    }

    NetworkRequest.Builder request = new NetworkRequest.Builder();

    if (transportType == TRANSPORT_TYPE_WIFI) {
        request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
    } else {
        request.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
        request.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
    }

    networkCallback = new ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(Network network) {
            super.onAvailable(network);

            connectivityManager.bindProcessToNetwork(null);
            connectivityManager.bindProcessToNetwork(network);

            /*Operation after switching over*/
        }

    };

   connectivityManager.requestNetwork(request.build(), networkCallback); 
}

【问题讨论】:

    标签: java android network-programming


    【解决方案1】:

    那是因为你已经用这条线绑定了你的Wifi网络:

    connectivityManager.bindProcessToNetwork(network);
    

    当您要切换到使用移动数据时,需要重置绑定的网络:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        manager.bindProcessToNetwork(null);
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        ConnectivityManager.setProcessDefaultNetwork(null);
    }
    

    【讨论】:

    • 你看我附上的代码了吗?当我需要移动数据时,我会清理 wifi (bindProcessToNetwork (null)) 并在移动数据上执行 (bindProcessToNetwork (network))。
    • 这仅适用于 Android SDK 23。低于此版本,您需要使用 ConnectivityManager.setProcessDefaultNetwork(null);
    • 你说的很明显。问题不同了!
    • 您的操作系统版本和制造商是什么?你检查过这个吗:stackoverflow.com/questions/55178150/…
    • 问题不在于设备。从第一次开启移动数据传输,一切正常,再次开启(开启wifi传输后),传输通过wifi,虽然动作和第一次打开时一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    相关资源
    最近更新 更多