Если мобильные данные включены и 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);
    }
});

}

Другие вопросы по тегам