So, I myself dug a little more in this thread and found useful information:
Thanks to this knowledge, I was finally able to find a working solution:
ConnectionFragment.java
public class ConnectionFragment extends Fragment { private static final String TAG = ConnectionFragment.class.getSimpleName(); private final NetworkCallback networkCallback = new NetworkCallback(); private ConnectivityManager connectivityManager; @Override public void onCreate(@Nullable Bundle savedInstanceState) { Log.v(TAG, "onCreate"); super.onCreate(savedInstanceState); connectivityManager = (ConnectivityManager) getActivity().getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); } @Override public void onStart() { Log.v(TAG, "onStart"); super.onStart(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { registerNetworkCallback(); } } @Override public void onStop() { Log.v(TAG, "onStop"); super.onStop(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { unregisterNetworkCallback(); } } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) private void registerNetworkCallback() { Log.v(TAG, "registerNetworkCallback"); final NetworkRequest networkRequest = new NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .build(); connectivityManager.registerNetworkCallback(networkRequest, networkCallback); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) private void unregisterNetworkCallback() { Log.v(TAG, "unregisterNetworkCallback"); connectivityManager.unregisterNetworkCallback(networkCallback); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) private class NetworkCallback extends ConnectivityManager.NetworkCallback { @Override public void onAvailable(Network network) { Log.v(TAG, "onAvailable"); bindProcessToNetwork(network); } @Override public void onLost(Network network) { Log.v(TAG, "onLost"); bindProcessToNetwork(null); } private void bindProcessToNetwork(final Network network) { Log.v(TAG, "bindProcessToNetwork: " + network); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { connectivityManager.bindProcessToNetwork(network); } else { ConnectivityManager.setProcessDefaultNetwork(network); } } } }
Hope this helps someone.
But keep in mind: for all other connections based on a different network, you need to configure the sockets manually.
Respectfully,
winklerrr
source share