SDK: Android 5.0.1.
Android build: LRX22C.
Device : Nexus 5.
Problem: KITKAT(4.4.4) and below API\'s
1) startUsingNetworkFeature(int n
Here's a function that can simplify the action of preferring certain types of networks for your application (should work for any current API level (26 as of writing):
private void alwaysPreferNetworksWith(@NonNull int[] capabilities, @NonNull int[] transportTypes) {
NetworkRequest.Builder request = new NetworkRequest.Builder();
// add capabilities
for (int cap: capabilities) {
request.addCapability(cap);
}
// add transport types
for (int trans: transportTypes) {
request.addTransportType(trans);
}
final ConnectivityManager connectivityManager = (ConnectivityManager) getApplicationContext().getSystemService(CONNECTIVITY_SERVICE);
connectivityManager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
try {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
ConnectivityManager.setProcessDefaultNetwork(network);
} else {
connectivityManager.bindProcessToNetwork(network);
}
} catch (IllegalStateException e) {
Log.e(TAG, "ConnectivityManager.NetworkCallback.onAvailable: ", e);
}
}
});
}
// Add any NetworkCapabilities.NET_CAPABILITY_...
int[] capabilities = new int[]{ NetworkCapabilities.NET_CAPABILITY_INTERNET };
// Add any NetworkCapabilities.TRANSPORT_...
int[] transportTypes = new int[]{ NetworkCapabilities.TRANSPORT_CELLULAR };
alwaysPreferNetworksWith(capabilities, transportTypes);