I'm developing and application that connects to a hardware device through wifi (generated by the device) and send data to it through a socket connection. The problem is that when mobile data (3G/4G) is activated android tries to send the data through it instead of sending it through the wifi generated by the device, because because the wifi has no internet connection. I was thinking of using ConnectivityManager#setNetworkPreference() but it has been deprecated in api 21.
How can I set it to send data using the wifi generated by the device instead of the mobile data interface?
After a lot of research and time trying to understand it all I found out that this isn't possible in versions previous to Android 5.0 (Lollipop), the OS only keeps one network interface up at a time and the apps don't have control over this.
So to do this on versions greater or equal to the Lollipop I did the following:
In case the version is equal or greater to Lollipop you need to do something like this:
After you finish you should stop binding the process with this:
This answer helped me unsderstand how to do it https://stackoverflow.com/a/29837637/2550932.
Network will switch back to mobile after setProcessDefaultNetwork to wifi, you can't send large data by this way, because all sockets created in this way will cease to work. I don't find a perfect way now, here is for reference only.
1.If you can get root access, do this before connect to wifi:
And delete it after you send data:
2.If you can get WRITE_SECURE_SETTINGS permission:
Or: