Stanislav's answer is correct, but incomplete, because it only works in Lollipop.
I wrote a complete solution for Lollipop and Marshmallow and so on, so that you can forward all network requests via WiFi when connected to a specific network of your choice.
Kotlin
In your business,
@RequiresApi(Build.VERSION_CODES.LOLLIPOP) class RoutingActivity : Activity() { private var mConnectivityManager: ConnectivityManager? = null private var mNetworkCallback: ConnectivityManager.NetworkCallback? = null
Send future network requests from the application via WiFi (even if this WiFi network is not connected to the Internet, and mobile data is connected to the Internet)
private fun routeNetworkRequestsThroughWifi(ssid: String) { mConnectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
Unregister callback on the network
private fun unregisterNetworkCallback(networkCallback: ConnectivityManager.NetworkCallback?) { if (networkCallback != null) { try { mConnectivityManager?.unregisterNetworkCallback(networkCallback) } catch (ignore: Exception) { } finally { mNetworkCallback = null } } }
Create network route
private fun createNetworkRoute(network: Network): Boolean? { var processBoundToNetwork: Boolean? = false when {
Release Network Route
private fun releaseNetworkRoute(): Boolean? { var processBoundToNetwork: Boolean? = false when { // 23 = Marshmallow Build.VERSION.SDK_INT >= 23 -> { processBoundToNetwork = mConnectivityManager?.bindProcessToNetwork(null) } // 21..22 = Lollipop Build.VERSION.SDK_INT in 21..22 -> { processBoundToNetwork = ConnectivityManager.setProcessDefaultNetwork(null) } } return processBoundToNetwork }
assistant
private fun getNetworkSsid(context: Context?): String { // WiFiManager must use application context (not activity context) otherwise a memory leak can occur val mWifiManager = context?.applicationContext?.getSystemService(Context.WIFI_SERVICE) as WifiManager val wifiInfo: WifiInfo? = mWifiManager.connectionInfo if (wifiInfo?.supplicantState == SupplicantState.COMPLETED) { return wifiInfo.ssid.removeSurrounding("\"") } return "" }
source share