Если мобильные данные включены и Wi-Fi также включен, но не имеет данных. то как отправить запрос по WIFI
Используйте этот код, если вы хотите использовать только Wi-Fi. Пожалуйста, убедитесь, что версия для Android должна быть больше 21.
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public static void stayOnWifi(Context context) {
final ConnectivityManager connection_manager =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder request = new NetworkRequest.Builder();
request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
connection_manager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
ConnectivityManager.setProcessDefaultNetwork(network);
}
});
}
2 ответа
Используйте, если вы хотите отправить запрос из WIFI, если у Wi-Fi нет данных.
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public static void stayOnWifi(Context context) {
final ConnectivityManager connection_manager =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder request = new NetworkRequest.Builder();
request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
connection_manager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
ConnectivityManager.setProcessDefaultNetwork(network);
}
});
}
Используйте этот метод, если вы хотите отправить запрос с Wi-Fi, если у Wi-Fi нет никаких данных. проблема вышеупомянутого кода в том, что когда вы принудительно устанавливаете приоритет использования данных. если мы установим приоритетное приложение wifi, мы не сможем использовать мобильные данные, а если установить приоритет для данных мобильных данных, то приложение не сможет использовать wifi, независимо от того, есть ли у wifi данные или нет,
Решение для проблемы Мы должны использовать широковещательную рассылку. Означает, что когда мы хотим отправить запрос с Wi-Fi, который не использует данные вышеупомянутым методом, и после завершения широковещательной рассылки, он устанавливает доступные данные, которые могут быть мобильными или Wi-Fi. значит ограничение снимет.
@RequiresApi (api = Build.VERSION_CODES.LOLLIPOP)
public static void stayOnMobileData(Context context) {
final ConnectivityManager connection_manager =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder request = new NetworkRequest.Builder();
request.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
request.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
connection_manager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
ConnectivityManager.setProcessDefaultNetwork(network);
}
});
}
Broadcast
открытый класс NetworkStateChangeBroadcast extends BroadcastReceiver {@RequiresApi (api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onReceive(Context context, Intent intent) {
if (in.bets.bettywifi.ui.common.BaseActivity.checkNetworkStatus(context)) {
final ConnectivityManager connMgr = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
final android.net.NetworkInfo wifi = connMgr
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
final android.net.NetworkInfo mobile = connMgr
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (wifi.isConnected()) {
BaseActivity.stayOnWifi(context);
} else if (mobile.isConnected()) {
BaseActivity.stayOnMobileData(context);
}
}
}
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) публичная статическая пустота stayOnWifi(Контекст контекста) {final ConnectivityManager connection_manager = (ConnectivityManager) context.getSystemService (Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder request = new NetworkRequest.Builder();
request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
connection_manager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
ConnectivityManager.setProcessDefaultNetwork(network);
}
});
}