启用wifi和移动网络后,如何选择通过android上的移动网络传输数据?

问题描述

除了一个例外,一切都可以正常工作。如果我们首先通过移动数据分配传输,那么一切都会正常进行,数据将通过移动网络传输。然后我选择了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); 
}

解决方法

这是因为您用以下线路将与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);
}