Force HttpURLConnection использовать мобильную сеть и вернуть ее в WiFi

Мое приложение использует HttpURLConnection для подключения к моим службам REST. Я регистрирую ошибки и замечаю, что иногда случается, что пользователь получает соединение WiFi, но имеет прокси.

Например, те аэропорты Wi-Fi, которые перенаправляют вас на оплату страниц, а затем позволяют вам пользоваться Интернетом. Мой код не следует за перенаправлениями.

То, что я действительно хочу, - это игнорировать присутствие Wi-Fi и принудительное общение по 3G/4G/E. Как я могу это сделать на Android?

Ответ 1

Перейти к мобильной сети:

Как только вы обнаружите прокси-сервер, вы откроете диалоговое окно с сообщением пользователю о том, что ваше приложение не может использовать эту сеть и, следовательно, вы переключаетесь на мобильную сеть. Вы можете переключиться на мобильную сеть, используя класс ConnectivityManager.

ConnectivityManager cm; 
cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
cm.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);

и вернитесь к умолчанию, когда вы закончите:

cm.setNetworkPreference(ConnectivityManager.DEFAULT_NETWORK_PREFERENCE);

Обнаружение прокси:

Обнаружение прокси с помощью следующего фрагмента

HttpURLConnection conn;
...
if (conn.getResponseCode() == HTTP_PROXY_AUTH){
    // You got a '407: Proxy authentication required' response.
    // Set the networkPreference() here and retry when 
    // network connection changes to TYPE_MOBILE.
}

Вы можете проверить это сообщение, чтобы узнать, как использовать HttpURLConnection через прокси: Как мне сделать HttpURLConnection использовать прокси?

Обнаружение "изменения сети":

Чтобы узнать, как обнаружить "изменение сети", см. этот пост: Android, Как обрабатывать изменения в сети (от GPRS до Wi-Fi и наоборот) при опросе данных

Обновление:

Если вы не можете показать диалог, по крайней мере, отправьте строку состояния Notification, чтобы пользователь узнал о сетевом коммутаторе через некоторое время.

Ответ 2

В ваших действиях, когда вы пытаетесь сделать вызов своих веб-служб

Просто Отключить WIFI, если он включен. В Интернете будет много фрагментов кода для этого как это

Теперь также проверьте, доступна ли мобильная сеть передачи данных или нет, и если доступно, сделайте свой вызов, в противном случае покажите пользователю диалог, для которого это приложение потребует мобильных сетей передачи данных для выполнения задач.

и как только вы закончите свои HTTP-вызовы, снова включите WIFI.